RSA 加密 解密 (长字符串) JAVA JS版本加解密

系统与系统的数据交互中,有些敏感数据是不能直接明文传输的,所以在发送数据之前要进行加密,在接收到数据时进行解密处理;然而由于系统与系统之间的开发语言不同。

本次需求是生成二维码是通过java生成,由php来解密。基于这类需求所以选择了RSA进行加解密。

生成RSA公私钥分成三步生成,第1、2步可以满足php的使用,由于java的私钥要转化为PKCS8格式才能使用,所以执行第3步来实现。

还有一种加密方式参考: DES ECB 模式 JAVA PHP C# 实现 加密 解密 兼容 。

1、生成私钥

openssl genrsa -out rsa_private_key.pem 1024

如下:

复制代码

1-----BEGIN RSA PRIVATE KEY----- 2MIICXQIBAAKBgQC6BSDlbRplhMMNZBKHX4xe8AwESpzHVfAcHHsX9FFSMuF91W3c 3xgT/g5n+qlLLFzCE3hWG/yX5NMAxR4mS3MlhyXKwko3tK9Ua691afod1lxORR3Ia 4Z8nV7v5Bv8y4JDe4E3/f/bQIGzroWiJ0sXTcO41GqvOw3G9leClSvjVnSwIDAQAB 5AoGAagooYYCbTomq4wRL562ZCDmQsBWUX7Fmia/Wn6YfgVsN3bx/vx2Gld2AOIMB 6ZVJXzzYGUYk7LV9bu/vKudRwWvtPIYzxPEOBoaFGPrEPTAfDVwOklhzTz3zDmCHi 7hLSpjQXYCG7boZ6G96NfKyTRSGPqgovHY3+KJvd/gAoZqOkCQQDt9YXfanpuwZx1 87MYjMEvoh5UY1vSsV72ts3/gTVEUkWdfXHj0XhyRhOL9Qu99TGZcoEwecygoUPLm 9dySyiXl/AkEAyB+JP8W7oTG/HTHc5QGDfwlPjIH1o5YG2I8Tp02i3G7OTJc/b9/+ 10SPxcKsT78xrgox5ModPKBX50F783Y2DANQJBAKY4Mjp882b4gWVybnlYHD4ir0h5 11ptHYPFvgnfu9plx6sT3Qp4DzWHth2vlUT1w0CPC83E8M28lFula4dP7tvtsCQQCt 12a2asdNVbophS3FrnuKAS/iaJRDVxRRk5oQMPACAZlYwAozC96gWZidb02S7cRHZV 135HPT6IwwppxD19hPrg/hAkBdnl+BGF/eRw80OHJtZBkLnY4Hx9YGft9AyIp3SB1z 14QDhaWHgFA+8lED+bWTvJxt/IMmzyYBaGnZbEjCECKZLD 15-----END RSA PRIVATE KEY-----

复制代码

2、生成公钥

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

如下:

1-----BEGIN PUBLIC KEY----- 2MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6BSDlbRplhMMNZBKHX4xe8AwE 3SpzHVfAcHHsX9FFSMuF91W3cxgT/g5n+qlLLFzCE3hWG/yX5NMAxR4mS3MlhyXKw 4ko3tK9Ua691afod1lxORR3IaZ8nV7v5Bv8y4JDe4E3/f/bQIGzroWiJ0sXTcO41G 5qvOw3G9leClSvjVnSwIDAQAB 6-----END PUBLIC KEY-----

3、将RSA私钥转换成PKCS8格式

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt > java_rsa_private_key.pem

如下:

复制代码

1-----BEGIN PRIVATE KEY----- 2MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALoFIOVtGmWEww1k 3EodfjF7wDARKnMdV8Bwcexf0UVIy4X3VbdzGBP+Dmf6qUssXMITeFYb/Jfk0wDFH 4iZLcyWHJcrCSje0r1Rrr3Vp+h3WXE5FHchpnydXu/kG/zLgkN7gTf9/9tAgbOuha 5InSxdNw7jUaq87Dcb2V4KVK+NWdLAgMBAAECgYBqCihhgJtOiarjBEvnrZkIOZCw 6FZRfsWaJr9afph+BWw3dvH+/HYaV3YA4gwFlUlfPNgZRiTstX1u7+8q51HBa+08h 7jPE8Q4GhoUY+sQ9MB8NXA6SWHNPPfMOYIeKEtKmNBdgIbtuhnob3o18rJNFIY+qC 8i8djf4om93+AChmo6QJBAO31hd9qem7BnHXsxiMwS+iHlRjW9KxXva2zf+BNURSR 9Z19cePReHJGE4v1C731MZlygTB5zKChQ8uZ3JLKJeX8CQQDIH4k/xbuhMb8dMdzl 10AYN/CU+MgfWjlgbYjxOnTaLcbs5Mlz9v3/5I/FwqxPvzGuCjHkyh08oFfnQXvzdj 11YMA1AkEApjgyOnzzZviBZXJueVgcPiKvSHmm0dg8W+Cd+72mXHqxPdCngPNYe2Ha 12+VRPXDQI8LzcTwzbyUW6Vrh0/u2+2wJBAK1rZqx01VuimFLcWue4oBL+JolENXFF 13GTmhAw8AIBmVjACjML3qBZmJ1vTZLtxEdlXkc9PojDCmnEPX2E+uD+ECQF2eX4EY 14X95HDzQ4cm1kGQudjgfH1gZ+30DIindIHXNAOFpYeAUD7yUQP5tZO8nG38gybPJg 15FoadlsSMIQIpksM= 16-----END PRIVATE KEY-----

复制代码

4.JAVA版本加解密:

复制代码

1import org.apache.commons.codec.binary.Base64; 2import org.apache.commons.lang3.ArrayUtils; 3 4import javax.crypto.Cipher; 5import java.security.*; 6import java.security.spec.PKCS8EncodedKeySpec; 7import java.security.spec.X509EncodedKeySpec; 8 9public class RSAUtils { 10 11 /** 12 * RSA最大加密明文大小 13 */ 14 private static final int MAX_ENCRYPT_BLOCK = 117; 15 16 /** 17 * RSA最大解密密文大小 18 */ 19 private static final int MAX_DECRYPT_BLOCK = 128; 20 21 public static final String SIGN_ALGORITHMS = "SHA256withRSA"; 22 23 private static String ALGORITHM_RSA = "RSA"; 24 25 /** 26 * 使用公钥将数据加密 27 * @param sourceData 28 * @param publicKey 29 * @return 30 */ 31 public static String publicEncrypt(String sourceData, String publicKey){ 32 return rsaEncrypt(sourceData,publicKey,false); 33 } 34 35 /** 36 * 使用私钥将数据加密 37 * @param sourceData 38 * @param privateKey 39 * @return 40 */ 41 public static String privateEncrypt(String sourceData, String privateKey){ 42 return rsaEncrypt(sourceData,privateKey,true); 43 } 44 45 46 /** 47 * 使用公钥解密 48 * @param encryptedData 49 * @param privateKey 50 * @return 51 */ 52 public static String publicDecrypt(String encryptedData, String privateKey) { 53 return rsaDecrypt(encryptedData,privateKey,false); 54 } 55 56 /** 57 * 使用私钥解密 58 * @param encryptedData 59 * @param privateKey 60 * @return 61 */ 62 public static String privateDecrypt(String encryptedData, String privateKey) { 63 return rsaDecrypt(encryptedData,privateKey,true); 64 } 65 66 protected static String rsaEncrypt(String sourceData, String key,boolean isPrivate){ 67 try { 68 Key key1 = isPrivate ? loadPrivateKey(key) : loadPublicKey(key); 69 byte[] data = sourceData.getBytes(); 70 byte[] dataReturn = new byte[0]; 71 Cipher cipher = Cipher.getInstance(ALGORITHM_RSA); 72 cipher.init(Cipher.ENCRYPT_MODE, key1); 73 74 // 加密时超过117字节就报错。为此采用分段加密的办法来加密 75 StringBuilder sb = new StringBuilder(); 76 for (int i = 0; i < data.length; i += MAX_ENCRYPT_BLOCK) { 77 byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(data, i,i + MAX_ENCRYPT_BLOCK)); 78 sb.append(new String(doFinal)); 79 dataReturn = ArrayUtils.addAll(dataReturn, doFinal); 80 } 81 82 return Base64.encodeBase64URLSafeString(dataReturn); 83 } catch (Exception e) { 84 e.printStackTrace(); 85 return null; 86 } 87 } 88 89 protected static String rsaDecrypt(String encryptedData, String key,boolean isPrivate){ 90 try { 91 Key key1 = isPrivate ? loadPrivateKey(key) : loadPublicKey(key); 92 byte[] data = Base64.decodeBase64(encryptedData); 93 94 Cipher cipher = Cipher.getInstance(ALGORITHM_RSA); 95 cipher.init(Cipher.DECRYPT_MODE, key1); 96 97 // 解密时超过128字节就报错。为此采用分段解密的办法来解密 98 byte[] dataReturn = new byte[0]; 99 for (int i = 0; i < data.length; i += MAX_DECRYPT_BLOCK) { 100 byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(data, i, i + MAX_DECRYPT_BLOCK)); 101 dataReturn = ArrayUtils.addAll(dataReturn, doFinal); 102 } 103 104 return new String(dataReturn); 105 } catch (Exception e) { 106 e.printStackTrace(); 107 return null; 108 } 109 } 110 111 /** 112 * 私钥加签名 113 * @param encryptData 114 * @param privateKey 115 * @return 116 */ 117 public static String rsaSign(String encryptData, String privateKey) { 118 try { 119 Signature signature = Signature.getInstance(SIGN_ALGORITHMS); 120 signature.initSign(loadPrivateKey(privateKey)); 121 signature.update(encryptData.getBytes()); 122 byte[] signed = signature.sign(); 123 return Base64.encodeBase64URLSafeString(signed); 124 } catch (Exception e) { 125 e.printStackTrace(); 126 } 127 return null; 128 } 129 130 /** 131 * 公钥验签 132 * @param encryptStr 133 * @param sign 134 * @param publicKey 135 * @return 136 * @throws Exception 137 */ 138 public static boolean verifySign(String encryptStr, String sign, String publicKey)throws Exception { 139 try { 140 Signature signature = Signature.getInstance(SIGN_ALGORITHMS); 141 signature.initVerify(loadPublicKey(publicKey)); 142 signature.update(encryptStr.getBytes()); 143 return signature.verify(Base64.decodeBase64(sign)); 144 } catch (NoSuchAlgorithmException e) { 145 throw new Exception(String.format("验证数字签名时没有[%s]此类算法", SIGN_ALGORITHMS)); 146 } catch (InvalidKeyException e) { 147 throw new Exception("验证数字签名时公钥无效"); 148 } catch (SignatureException e) { 149 throw new Exception("验证数字签名时出现异常"); 150 } 151 } 152 153 public static PublicKey loadPublicKey(String publicKeyStr) throws Exception { 154 byte[] buffer = Base64.decodeBase64(publicKeyStr); 155 KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_RSA); 156 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer); 157 return keyFactory.generatePublic(keySpec); 158 } 159 160 public static PrivateKey loadPrivateKey(String privateKeyStr) throws Exception { 161 byte[] buffer = Base64.decodeBase64(privateKeyStr); 162 PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer); 163 KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_RSA); 164 return keyFactory.generatePrivate(keySpec); 165 } 166 167 public static String urlsafe_encode (String encryptStr){ 168 return encryptStr.replaceAll("\\+","-").replaceAll("/","_").replaceAll("=","").replaceAll("(\r\n|\r|\n|\n\r)",""); 169 170 } 171 172 public static String urlsafe_decode(String encryptStr){ 173 encryptStr= encryptStr.replaceAll("-","+").replaceAll("_","/"); 174 int mob = encryptStr.length()%4; 175 if(mob>0){ 176 encryptStr+="====".substring(mob); 177 } 178 return encryptStr; 179 } 180 181 public static void main(String[ ] asdfs) throws Exception { 182 String publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6BSDlbRplhMMNZBKHX4xe8AwE" + 183 "SpzHVfAcHHsX9FFSMuF91W3cxgT/g5n+qlLLFzCE3hWG/yX5NMAxR4mS3MlhyXKw" + 184 "ko3tK9Ua691afod1lxORR3IaZ8nV7v5Bv8y4JDe4E3/f/bQIGzroWiJ0sXTcO41G" + 185 "qvOw3G9leClSvjVnSwIDAQAB"; 186 String privateKeyStr = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALoFIOVtGmWEww1k" + 187 "EodfjF7wDARKnMdV8Bwcexf0UVIy4X3VbdzGBP+Dmf6qUssXMITeFYb/Jfk0wDFH" + 188 "iZLcyWHJcrCSje0r1Rrr3Vp+h3WXE5FHchpnydXu/kG/zLgkN7gTf9/9tAgbOuha" + 189 "InSxdNw7jUaq87Dcb2V4KVK+NWdLAgMBAAECgYBqCihhgJtOiarjBEvnrZkIOZCw" + 190 "FZRfsWaJr9afph+BWw3dvH+/HYaV3YA4gwFlUlfPNgZRiTstX1u7+8q51HBa+08h" + 191 "jPE8Q4GhoUY+sQ9MB8NXA6SWHNPPfMOYIeKEtKmNBdgIbtuhnob3o18rJNFIY+qC" + 192 "i8djf4om93+AChmo6QJBAO31hd9qem7BnHXsxiMwS+iHlRjW9KxXva2zf+BNURSR" + 193 "Z19cePReHJGE4v1C731MZlygTB5zKChQ8uZ3JLKJeX8CQQDIH4k/xbuhMb8dMdzl" + 194 "AYN/CU+MgfWjlgbYjxOnTaLcbs5Mlz9v3/5I/FwqxPvzGuCjHkyh08oFfnQXvzdj" + 195 "YMA1AkEApjgyOnzzZviBZXJueVgcPiKvSHmm0dg8W+Cd+72mXHqxPdCngPNYe2Ha" + 196 "+VRPXDQI8LzcTwzbyUW6Vrh0/u2+2wJBAK1rZqx01VuimFLcWue4oBL+JolENXFF" + 197 "GTmhAw8AIBmVjACjML3qBZmJ1vTZLtxEdlXkc9PojDCmnEPX2E+uD+ECQF2eX4EY" + 198 "X95HDzQ4cm1kGQudjgfH1gZ+30DIindIHXNAOFpYeAUD7yUQP5tZO8nG38gybPJg" + 199 "FoadlsSMIQIpksM="; 200 201 //加密 202 String data = "i like java"; 203 String privateEncryptStr = RSAUtils.privateEncrypt(data, privateKeyStr); 204 String publicEncryptStr = RSAUtils.publicEncrypt(data, publicKeyStr); 205 String privateEncryptSign = RSAUtils.rsaSign(privateEncryptStr,privateKeyStr); 206 String publicEncryptSign = RSAUtils.rsaSign(publicEncryptStr,privateKeyStr); 207 208 System.out.println("source:" + data); 209 System.out.println("private encryptStr: " + privateEncryptStr); 210 System.out.println("public encryptStr: " + publicEncryptStr); 211 System.out.println("private encrypt sign: " + privateEncryptSign); 212 System.out.println("public encrypt sign: " + publicEncryptSign); 213 System.out.println("public decrypt:" + RSAUtils.publicDecrypt(privateEncryptStr, publicKeyStr)); 214 System.out.println("private decrypt:" + RSAUtils.privateDecrypt(publicEncryptStr, privateKeyStr)); 215 System.out.println("verifySign1: " + RSAUtils.verifySign(privateEncryptStr,privateEncryptSign,publicKeyStr)); 216 System.out.println("verifySign2: " + RSAUtils.verifySign(publicEncryptStr,publicEncryptSign,publicKeyStr)); 217 218 System.out.println("\r\n"); 219 publicEncryptStr = "WopnO2LnolZ7XpOwA_ktOhfkkaQQJQgkJudk3ZH_-ob36GQFv968nE1UBXxNekA9pIHBcvcl0ZWfwFhk-kyOF2FmQvpPY9LkqiCV0T32vhJet0n93ti2PBoFILxvChjzdOgSG9M0flH78Vm696Q4mHo7VMt_XMoHDTd3Rbagvt8"; 220 privateEncryptStr = "Fwb5BtLRveCWbx7FkXarl1zVOdwDvbDTl7gv-vPHXpj-T2wm9GlUDn3X0wnHHXkE8cqAT6PcE0g0ide6beP9_ysHMLgnC6wVqkomIKsi6C9TcGd4d6XQBjeJgdgccvDcD-7pcKrV9W-_Z7jkYkwwrjPGPd_uckEHR_cDXyOX4PU"; 221 System.out.println("php >>>> private decrypt: " + RSAUtils.privateDecrypt(publicEncryptStr, privateKeyStr)); 222 System.out.println("php >>>> public decrypt: " + RSAUtils.publicDecrypt(privateEncryptStr, publicKeyStr)); 223 224 publicEncryptStr = "T2LFtY3dF_b6OBO07BN-3LtMSEBZqDukovDZ4HGCff8wosvlowf6IFJ3U7LFBIeHfiHBKiFuAV8-pFltCfTXtA4AwgVUnwbBMBWBfIJiLDi02ev30V-5BcYEuSF-cEdnSUd7WecrX4rHhzYLueGuj8H6c7RRbSbrJ6_3EFfU-K0"; 225 System.out.println("js >>>> private decrypt: " + RSAUtils.privateDecrypt(publicEncryptStr, privateKeyStr)); 226 } 227}

复制代码

输出如下:

复制代码

1source: i like java 2private encryptStr: fHG5JMpTTF-KzrPCp827opRy3BvqmVIpIZS4gVuWqY5NeLsgoLxdrq3SaxUp_oBQ9pVqNlEiU9SIwbqJDjIqjHsCtVMOLoEdWicib_wCaoB16veKTEC4GnvviJwlS5IedH27oWGHKTTc6Ii5cLiQncjDAadvm0KCdC74yrwPqnc 3public encryptStr: raoQQsfN0KBfPAMRWnxr9kFPvJ6BgQ7PRBCMnz0nWsH03sD4IdlMvKpj78BHe7V7Ga1HZHyDxuJhVaJ0T5qKl8qHXzvKquzNtdMru7G4X9o8ylzkGxJLg-HYCWOrsZ77ZMaKoV9p-TCf-yMI21OpL_5JGot-XNfVVPkmg0z9FW0 4private encrypt sign: jlJvXY5t8KesDi3WaPr71jj2BigHLDr3b827Jl9xspbecdUjPB44Xe3sjWnzvFDLpKJGiNTvqE-Qyu3FZpG_NyI5yhVrAQgZmyYfVywmeDDsTOQYk1xP0UEfFgB0MXsFdlfSdMu5JcR5kgC5Xl5jds1b0Z2Nq7gQ-bvFJQcuHgU 5public encrypt sign: ngN2kQppfITyn5yAfNc1c-ofK20trKJWXIjlaJhWtm7s2jzv5rcsPY5JH06CMAIIbnKGIUcoVvMeKavAIVFb4G_h3CvXIYnxMjQL19Op-SbtyGNwT-rZzTEP8tKfxFRVm7SrHHDz2s287S3vqQz9vGEGNmgDHEdrCfHBmmoFkQA 6public decrypt: i like java 7private decrypt: i like java 8verifySign1: true 9verifySign2: true 10 11 12php >>>> private decrypt: i like php 13php >>>> public decrypt: i like php 14 15js >>>> private decrypt: i like JS

复制代码

5.PHP版本加解密

复制代码

1<?php 2 3$private_key = <<<KEY 4-----BEGIN RSA PRIVATE KEY----- 5MIICXQIBAAKBgQC6BSDlbRplhMMNZBKHX4xe8AwESpzHVfAcHHsX9FFSMuF91W3c 6xgT/g5n+qlLLFzCE3hWG/yX5NMAxR4mS3MlhyXKwko3tK9Ua691afod1lxORR3Ia 7Z8nV7v5Bv8y4JDe4E3/f/bQIGzroWiJ0sXTcO41GqvOw3G9leClSvjVnSwIDAQAB 8AoGAagooYYCbTomq4wRL562ZCDmQsBWUX7Fmia/Wn6YfgVsN3bx/vx2Gld2AOIMB 9ZVJXzzYGUYk7LV9bu/vKudRwWvtPIYzxPEOBoaFGPrEPTAfDVwOklhzTz3zDmCHi 10hLSpjQXYCG7boZ6G96NfKyTRSGPqgovHY3+KJvd/gAoZqOkCQQDt9YXfanpuwZx1 117MYjMEvoh5UY1vSsV72ts3/gTVEUkWdfXHj0XhyRhOL9Qu99TGZcoEwecygoUPLm 12dySyiXl/AkEAyB+JP8W7oTG/HTHc5QGDfwlPjIH1o5YG2I8Tp02i3G7OTJc/b9/+ 13SPxcKsT78xrgox5ModPKBX50F783Y2DANQJBAKY4Mjp882b4gWVybnlYHD4ir0h5 14ptHYPFvgnfu9plx6sT3Qp4DzWHth2vlUT1w0CPC83E8M28lFula4dP7tvtsCQQCt 15a2asdNVbophS3FrnuKAS/iaJRDVxRRk5oQMPACAZlYwAozC96gWZidb02S7cRHZV 165HPT6IwwppxD19hPrg/hAkBdnl+BGF/eRw80OHJtZBkLnY4Hx9YGft9AyIp3SB1z 17QDhaWHgFA+8lED+bWTvJxt/IMmzyYBaGnZbEjCECKZLD 18-----END RSA PRIVATE KEY----- 19KEY; 20 21$private8_key = <<<KEY 22-----BEGIN PRIVATE KEY----- 23MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALoFIOVtGmWEww1k 24EodfjF7wDARKnMdV8Bwcexf0UVIy4X3VbdzGBP+Dmf6qUssXMITeFYb/Jfk0wDFH 25iZLcyWHJcrCSje0r1Rrr3Vp+h3WXE5FHchpnydXu/kG/zLgkN7gTf9/9tAgbOuha 26InSxdNw7jUaq87Dcb2V4KVK+NWdLAgMBAAECgYBqCihhgJtOiarjBEvnrZkIOZCw 27FZRfsWaJr9afph+BWw3dvH+/HYaV3YA4gwFlUlfPNgZRiTstX1u7+8q51HBa+08h 28jPE8Q4GhoUY+sQ9MB8NXA6SWHNPPfMOYIeKEtKmNBdgIbtuhnob3o18rJNFIY+qC 29i8djf4om93+AChmo6QJBAO31hd9qem7BnHXsxiMwS+iHlRjW9KxXva2zf+BNURSR 30Z19cePReHJGE4v1C731MZlygTB5zKChQ8uZ3JLKJeX8CQQDIH4k/xbuhMb8dMdzl 31AYN/CU+MgfWjlgbYjxOnTaLcbs5Mlz9v3/5I/FwqxPvzGuCjHkyh08oFfnQXvzdj 32YMA1AkEApjgyOnzzZviBZXJueVgcPiKvSHmm0dg8W+Cd+72mXHqxPdCngPNYe2Ha 33+VRPXDQI8LzcTwzbyUW6Vrh0/u2+2wJBAK1rZqx01VuimFLcWue4oBL+JolENXFF 34GTmhAw8AIBmVjACjML3qBZmJ1vTZLtxEdlXkc9PojDCmnEPX2E+uD+ECQF2eX4EY 35X95HDzQ4cm1kGQudjgfH1gZ+30DIindIHXNAOFpYeAUD7yUQP5tZO8nG38gybPJg 36FoadlsSMIQIpksM= 37-----END PRIVATE KEY----- 38KEY; 39 40$public_key = <<<KEY 41-----BEGIN PUBLIC KEY----- 42MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6BSDlbRplhMMNZBKHX4xe8AwE 43SpzHVfAcHHsX9FFSMuF91W3cxgT/g5n+qlLLFzCE3hWG/yX5NMAxR4mS3MlhyXKw 44ko3tK9Ua691afod1lxORR3IaZ8nV7v5Bv8y4JDe4E3/f/bQIGzroWiJ0sXTcO41G 45qvOw3G9leClSvjVnSwIDAQAB 46-----END PUBLIC KEY----- 47KEY; 48 49$data = 'i like php'; 50//使用公钥将数据加密 51$encrypt_data = RsaUtils::publicEncrypt($data,$public_key); 52//使用私钥将数据解密 53$decrypt_data = RsaUtils::privateDecrypt($encrypt_data,$private_key); 54 55echo 'public encrypt data:'.$encrypt_data.PHP_EOL; 56echo 'private decrypt data:'.$decrypt_data.PHP_EOL; 57 58 59//使用私钥将数据加密 60$encrypt_data = RsaUtils::privateEncrypt($data,$private_key); 61//使用私钥将加密数据加签 62$private_encrypt_sign = RsaUtils::rsaSign($encrypt_data,$private_key); 63//使用公钥解签 64$public_check_sign = RsaUtils::verifySign($encrypt_data,$private_encrypt_sign,$public_key); 65//使用公钥将数据解密 66$decrypt_data = RsaUtils::publicDecrypt($encrypt_data,$public_key); 67 68echo 'private encrypt data: '.$encrypt_data.PHP_EOL; 69echo 'private encrypt sign: '.$private_encrypt_sign.PHP_EOL; 70echo 'public check sign: '.$public_check_sign.PHP_EOL; 71echo 'public decrypt data: '.$decrypt_data.PHP_EOL; 72 73 74 75//验证java加密解密方法 76$private_encrypt_data = 'fHG5JMpTTF-KzrPCp827opRy3BvqmVIpIZS4gVuWqY5NeLsgoLxdrq3SaxUp_oBQ9pVqNlEiU9SIwbqJDjIqjHsCtVMOLoEdWicib_wCaoB16veKTEC4GnvviJwlS5IedH27oWGHKTTc6Ii5cLiQncjDAadvm0KCdC74yrwPqnc'; 77$public_decrypt_data = RsaUtils::publicDecrypt($private_encrypt_data,$public_key); 78$sign_data1 = 'jlJvXY5t8KesDi3WaPr71jj2BigHLDr3b827Jl9xspbecdUjPB44Xe3sjWnzvFDLpKJGiNTvqE-Qyu3FZpG_NyI5yhVrAQgZmyYfVywmeDDsTOQYk1xP0UEfFgB0MXsFdlfSdMu5JcR5kgC5Xl5jds1b0Z2Nq7gQ-bvFJQcuHgU'; 79$verify_sign1 = RsaUtils::verifySign($private_encrypt_data,$sign_data1,$public_key); 80 81$public_encrypt_data = 'raoQQsfN0KBfPAMRWnxr9kFPvJ6BgQ7PRBCMnz0nWsH03sD4IdlMvKpj78BHe7V7Ga1HZHyDxuJhVaJ0T5qKl8qHXzvKquzNtdMru7G4X9o8ylzkGxJLg-HYCWOrsZ77ZMaKoV9p-TCf-yMI21OpL_5JGot-XNfVVPkmg0z9FW0'; 82$private_decrypt_data = RsaUtils::privateDecrypt($public_encrypt_data, $private_key); 83$sign_data2 = 'ngN2kQppfITyn5yAfNc1c-ofK20trKJWXIjlaJhWtm7s2jzv5rcsPY5JH06CMAIIbnKGIUcoVvMeKavAIVFb4G_h3CvXIYnxMjQL19Op-SbtyGNwT-rZzTEP8tKfxFRVm7SrHHDz2s287S3vqQz9vGEGNmgDHEdrCfHBmmoFkQA'; 84$verify_sign2 = RsaUtils::verifySign($public_encrypt_data,$sign_data2,$public_key); 85 86echo PHP_EOL; 87echo 'public_decrypt_data: '.$public_decrypt_data.PHP_EOL; 88echo 'verifySign1: '. $verify_sign1.PHP_EOL; 89 90echo 'private_decrypt_data: '.$private_decrypt_data.PHP_EOL; 91echo 'verifySign2: '. $verify_sign2.PHP_EOL; 92 93$public_encrypt_data = 'T2LFtY3dF_b6OBO07BN-3LtMSEBZqDukovDZ4HGCff8wosvlowf6IFJ3U7LFBIeHfiHBKiFuAV8-pFltCfTXtA4AwgVUnwbBMBWBfIJiLDi02ev30V-5BcYEuSF-cEdnSUd7WecrX4rHhzYLueGuj8H6c7RRbSbrJ6_3EFfU-K0'; 94$private_decrypt_data = RsaUtils::privateDecrypt($public_encrypt_data,$private_key); 95echo PHP_EOL; 96echo 'private_decrypt_data: '.$private_decrypt_data.PHP_EOL; 97 98 99 100class RsaUtils{ 101 102 /** 103 * 签名算法,SHA256WithRSA 104 */ 105 private const SIGNATURE_ALGORITHM = OPENSSL_ALGO_SHA256; 106 107 /** 108 * RSA最大加密明文大小 109 */ 110 private const MAX_ENCRYPT_BLOCK = 117; 111 112 /** 113 * RSA最大解密密文大小 114 */ 115 private const MAX_DECRYPT_BLOCK = 128; 116 117 /** 118 * 使用公钥将数据加密 119 * @param $data string 需要加密的数据 120 * @param $publicKey string 公钥 121 * @return string 返回加密串(base64编码) 122 */ 123 public static function publicEncrypt($data,$publicKey){ 124 $data = str_split($data, self::MAX_ENCRYPT_BLOCK); 125 126 $encrypted = ''; 127 foreach($data as & $chunk){ 128 if(!openssl_public_encrypt($chunk, $encryptData, $publicKey)){ 129 return ''; 130 }else{ 131 $encrypted .= $encryptData; 132 } 133 } 134 return self::urlSafeBase64encode($encrypted); 135 } 136 137 /** 138 * 使用私钥解密 139 * @param $data string 需要解密的数据 140 * @param $privateKey string 私钥 141 * @return string 返回解密串 142 */ 143 public static function privateDecrypt($data,$privateKey){ 144 $data = str_split(self::urlSafeBase64decode($data), self::MAX_DECRYPT_BLOCK); 145 146 $decrypted = ''; 147 foreach($data as & $chunk){ 148 if(!openssl_private_decrypt($chunk, $decryptData, $privateKey)){ 149 return ''; 150 }else{ 151 $decrypted .= $decryptData; 152 } 153 } 154 return $decrypted; 155 } 156 157 /** 158 * 使用私钥将数据加密 159 * @param $data string 需要加密的数据 160 * @param $privateKey string 私钥 161 * @return string 返回加密串(base64编码) 162 */ 163 public static function privateEncrypt($data,$privateKey){ 164 $data = str_split($data, self::MAX_ENCRYPT_BLOCK); 165 166 $encrypted = ''; 167 foreach($data as & $chunk){ 168 if(!openssl_private_encrypt($chunk, $encryptData, $privateKey)){ 169 return ''; 170 }else{ 171 $encrypted .= $encryptData; 172 } 173 } 174 return self::urlSafeBase64encode($encrypted); 175 } 176 177 178 /** 179 * 使用公钥解密 180 * @param $data string 需要解密的数据 181 * @param $publicKey string 公钥 182 * @return string 返回解密串 183 */ 184 public static function publicDecrypt($data,$publicKey){ 185 $data = str_split(self::urlSafeBase64decode($data), self::MAX_DECRYPT_BLOCK); 186 187 $decrypted = ''; 188 foreach($data as & $chunk){ 189 if(!openssl_public_decrypt($chunk, $decryptData, $publicKey)){ 190 return ''; 191 }else{ 192 $decrypted .= $decryptData; 193 } 194 } 195 return $decrypted; 196 } 197 198 199 /** 200 * 私钥加签名 201 * @param $data 被加签数据 202 * @param $privateKey 私钥 203 * @return mixed|string 204 */ 205 public static function rsaSign($data, $privateKey){ 206 if(openssl_sign($data, $sign, $privateKey, self::SIGNATURE_ALGORITHM)){ 207 return self::urlSafeBase64encode($sign); 208 } 209 return ''; 210 } 211 212 /** 213 * 公钥验签 214 * @param $data 被加签数据 215 * @param $sign 签名 216 * @param $publicKey 公钥 217 * @return bool 218 */ 219 public static function verifySign($data, $sign, $publicKey):bool { 220 return (1 == openssl_verify($data, self::urlSafeBase64decode($sign), $publicKey, self::SIGNATURE_ALGORITHM)); 221 } 222 223 /** 224 * url base64编码 225 * @param $string 226 * @return mixed|string 227 */ 228 public static function urlSafeBase64encode($string){ 229 $data = str_replace(array('+','/','='), array( '-','_',''), base64_encode($string)); 230 return $data; 231 } 232 233 /** 234 * url base64解码 235 * @param $string 236 * @return bool|string 237 */ 238 public static function urlSafeBase64decode($string){ 239 $data = str_replace(array('-','_'), array('+','/'), $string); 240 $mod4 = strlen($data) % 4; 241 if($mod4){ 242 $data .= substr('====', $mod4); 243 } 244 return base64_decode($data); 245 } 246}

复制代码

输出如下:

复制代码

1public encrypt data: WopnO2LnolZ7XpOwA_ktOhfkkaQQJQgkJudk3ZH_-ob36GQFv968nE1UBXxNekA9pIHBcvcl0ZWfwFhk-kyOF2FmQvpPY9LkqiCV0T32vhJet0n93ti2PBoFILxvChjzdOgSG9M0flH78Vm696Q4mHo7VMt_XMoHDTd3Rbagvt8 2private decrypt data: i like php 3public encrypt data: Fwb5BtLRveCWbx7FkXarl1zVOdwDvbDTl7gv-vPHXpj-T2wm9GlUDn3X0wnHHXkE8cqAT6PcE0g0ide6beP9_ysHMLgnC6wVqkomIKsi6C9TcGd4d6XQBjeJgdgccvDcD-7pcKrV9W-_Z7jkYkwwrjPGPd_uckEHR_cDXyOX4PU 4private rsa sign: T-I3KLkBEMRi9YdflyjNZxh_IhEC2mG4vFaq5FeFzs03l7ojtmf3pXFOwjz6qbHUwIJ-tjIMVammfCrYKa0AjMAX_L7-99_EUPmMvmjXS_8z0aZuY5dZPgRCBxklKem56r0qss-iSGTGsh3eivhUiHvtRTBXhtbkpjjlkkqXy-k 5public check sign: 1 6private decrypt data: i like php 7public_decrypt_data: i like java 8verifySign1: 1 9private_decrypt_data: i like java 10verifySign2: 1private_decrypt_data: i like JS

复制代码

6.JS版本加解密

复制代码

1var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 2var b64pad = "="; 3 4var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"; 5 6//整型转字符串 7function int2char(n) { 8 return BI_RM.charAt(n); 9} 10 11//十六进制转Base64字符串 12function hex2b64(h) { 13 var i; 14 var c; 15 var ret = ""; 16 for (i = 0; i + 3 <= h.length; i += 3) { 17 c = parseInt(h.substring(i, i + 3), 16); 18 ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63); 19 } 20 if (i + 1 == h.length) { 21 c = parseInt(h.substring(i, i + 1), 16); 22 ret += b64map.charAt(c << 2); 23 } 24 else if (i + 2 == h.length) { 25 c = parseInt(h.substring(i, i + 2), 16); 26 ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4); 27 } 28 while ((ret.length & 3) > 0) { 29 ret += b64pad; 30 } 31 return ret; 32} 33 34//Base64字符串转十六进制 35function b64tohex(s) { 36 var ret = ""; 37 var i; 38 var k = 0; // b64 state, 0-3 39 var slop = 0; 40 for (i = 0; i < s.length; ++i) { 41 if (s.charAt(i) == b64pad) { 42 break; 43 } 44 var v = b64map.indexOf(s.charAt(i)); 45 if (v < 0) { 46 continue; 47 } 48 if (k == 0) { 49 ret += int2char(v >> 2); 50 slop = v & 3; 51 k = 1; 52 } 53 else if (k == 1) { 54 ret += int2char((slop << 2) | (v >> 4)); 55 slop = v & 0xf; 56 k = 2; 57 } 58 else if (k == 2) { 59 ret += int2char(slop); 60 ret += int2char(v >> 2); 61 slop = v & 3; 62 k = 3; 63 } 64 else { 65 ret += int2char((slop << 2) | (v >> 4)); 66 ret += int2char(v & 0xf); 67 k = 0; 68 } 69 } 70 if (k == 1) { 71 ret += int2char(slop << 2); 72 } 73 return ret; 74} 75 76//十六进制转字节 77function hexToBytes(hex) { 78 for (var bytes = [], c = 0; c < hex.length; c += 2) 79 bytes.push(parseInt(hex.substr(c, 2), 16)); 80 return bytes; 81} 82 83//字节转十六进制 84function bytesToHex(bytes) { 85 for (var hex = [], i = 0; i < bytes.length; i++) { 86 hex.push((bytes[i] >>> 4).toString(16)); 87 hex.push((bytes[i] & 0xF).toString(16)); 88 } 89 return hex.join(""); 90} 91 92String.prototype.replaceAllStr=function(f,e){ 93 var reg=new RegExp(f,"g"); 94 return this.replace(reg,e); 95} 96 97function urlsafeEncode(e) { 98 return e.replaceAllStr("\\+","-").replaceAllStr("/","_").replaceAllStr("=",""); 99} 100 101function urlsafeDecode(e) { 102 e = e.replaceAllStr("-","+").replaceAllStr("_","/"); 103 var mob = e.length%4; 104 if(mob>0){ 105 e += "====".substr(mob); 106 } 107 return e; 108} 109 110 111//长字符串加密 112JSEncrypt.prototype.encryptLong = function (string) { 113 var k = this.getKey(); 114 //var MAX_ENCRYPT_BLOCK = (((k.n.bitLength() + 7) >> 3) - 11); 115 var MAX_ENCRYPT_BLOCK = 117; 116 117 try { 118 var lt = ""; 119 var ct = ""; 120 //RSA每次加密117bytes,需要辅助方法判断字符串截取位置 121 //1.获取字符串截取点 122 var bytes = new Array(); 123 bytes.push(0); 124 var byteNo = 0; 125 var len, c; 126 len = string.length; 127 128 var temp = 0; 129 for (var i = 0; i < len; i++) { 130 c = string.charCodeAt(i); 131 if (c >= 0x010000 && c <= 0x10FFFF) { 132 byteNo += 4; 133 } else if (c >= 0x000800 && c <= 0x00FFFF) { 134 byteNo += 3; 135 } else if (c >= 0x000080 && c <= 0x0007FF) { 136 byteNo += 2; 137 } else { 138 byteNo += 1; 139 } 140 if ((byteNo % MAX_ENCRYPT_BLOCK) >= 114 || (byteNo % MAX_ENCRYPT_BLOCK) == 0) { 141 if (byteNo - temp >= 114) { 142 bytes.push(i); 143 temp = byteNo; 144 } 145 } 146 } 147 148 //2.截取字符串并分段加密 149 if (bytes.length > 1) { 150 for (var i = 0; i < bytes.length - 1; i++) { 151 var str; 152 if (i == 0) { 153 str = string.substring(0, bytes[i + 1] + 1); 154 } else { 155 str = string.substring(bytes[i] + 1, bytes[i + 1] + 1); 156 } 157 var t1 = k.encrypt(str); 158 ct += t1; 159 } 160 ; 161 if (bytes[bytes.length - 1] != string.length - 1) { 162 var lastStr = string.substring(bytes[bytes.length - 1] + 1); 163 ct += k.encrypt(lastStr); 164 } 165 return hex2b64(ct); 166 } 167 var t = k.encrypt(string); 168 var y = hex2b64(t); 169 return y; 170 } catch (ex) { 171 return false; 172 } 173}; 174 175//长字符串解密 176JSEncrypt.prototype.decryptLong = function (string) { 177 var k = this.getKey(); 178 // var MAX_DECRYPT_BLOCK = ((k.n.bitLength()+7)>>3); 179 var MAX_DECRYPT_BLOCK = 128; 180 try { 181 var ct = ""; 182 var t1; 183 var bufTmp; 184 var hexTmp; 185 var str = b64tohex(string); 186 var buf = hexToBytes(str); 187 var inputLen = buf.length; 188 //开始长度 189 var offSet = 0; 190 //结束长度 191 var endOffSet = MAX_DECRYPT_BLOCK; 192 193 //分段加密 194 while (inputLen - offSet > 0) { 195 if (inputLen - offSet > MAX_DECRYPT_BLOCK) { 196 bufTmp = buf.slice(offSet, endOffSet); 197 hexTmp = bytesToHex(bufTmp); 198 t1 = k.decrypt(hexTmp); 199 ct += t1; 200 201 } else { 202 bufTmp = buf.slice(offSet, inputLen); 203 hexTmp = bytesToHex(bufTmp); 204 t1 = k.decrypt(hexTmp); 205 ct += t1; 206 207 } 208 offSet += MAX_DECRYPT_BLOCK; 209 endOffSet += MAX_DECRYPT_BLOCK; 210 } 211 return ct; 212 } catch (ex) { 213 return false; 214 } 215}; 216 217 218// Call this code when the page is done loading. 219var publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6BSDlbRplhMMNZBKHX4xe8AwE" + 220 "SpzHVfAcHHsX9FFSMuF91W3cxgT/g5n+qlLLFzCE3hWG/yX5NMAxR4mS3MlhyXKw" + 221 "ko3tK9Ua691afod1lxORR3IaZ8nV7v5Bv8y4JDe4E3/f/bQIGzroWiJ0sXTcO41G" + 222 "qvOw3G9leClSvjVnSwIDAQAB"; 223 224var privateKeyStr = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALoFIOVtGmWEww1k" + 225 "EodfjF7wDARKnMdV8Bwcexf0UVIy4X3VbdzGBP+Dmf6qUssXMITeFYb/Jfk0wDFH" + 226 "iZLcyWHJcrCSje0r1Rrr3Vp+h3WXE5FHchpnydXu/kG/zLgkN7gTf9/9tAgbOuha" + 227 "InSxdNw7jUaq87Dcb2V4KVK+NWdLAgMBAAECgYBqCihhgJtOiarjBEvnrZkIOZCw" + 228 "FZRfsWaJr9afph+BWw3dvH+/HYaV3YA4gwFlUlfPNgZRiTstX1u7+8q51HBa+08h" + 229 "jPE8Q4GhoUY+sQ9MB8NXA6SWHNPPfMOYIeKEtKmNBdgIbtuhnob3o18rJNFIY+qC" + 230 "i8djf4om93+AChmo6QJBAO31hd9qem7BnHXsxiMwS+iHlRjW9KxXva2zf+BNURSR" + 231 "Z19cePReHJGE4v1C731MZlygTB5zKChQ8uZ3JLKJeX8CQQDIH4k/xbuhMb8dMdzl" + 232 "AYN/CU+MgfWjlgbYjxOnTaLcbs5Mlz9v3/5I/FwqxPvzGuCjHkyh08oFfnQXvzdj" + 233 "YMA1AkEApjgyOnzzZviBZXJueVgcPiKvSHmm0dg8W+Cd+72mXHqxPdCngPNYe2Ha" + 234 "+VRPXDQI8LzcTwzbyUW6Vrh0/u2+2wJBAK1rZqx01VuimFLcWue4oBL+JolENXFF" + 235 "GTmhAw8AIBmVjACjML3qBZmJ1vTZLtxEdlXkc9PojDCmnEPX2E+uD+ECQF2eX4EY" + 236 "X95HDzQ4cm1kGQudjgfH1gZ+30DIindIHXNAOFpYeAUD7yUQP5tZO8nG38gybPJg" + 237 "FoadlsSMIQIpksM="; 238 239 240var sourceStr = "i like JS"; 241 242//公钥加密 243var encrypt = new JSEncrypt(); 244encrypt.setPublicKey(publicKeyStr); 245var encrypted = encrypt.encryptLong(sourceStr); 246encrypted = urlsafeEncode(encrypted); 247 248//私钥解密 249var decrypt = new JSEncrypt(); 250decrypt.setPrivateKey(privateKeyStr); 251var uncrypted = decrypt.decryptLong(urlsafeDecode(encrypted)); 252 253console.log("public encrypted: ",encrypted); 254console.log("private uncrypted: ",uncrypted);

  console.log("private uncrypted: ",decrypt.decryptLong(urlsafeDecode("WopnO2LnolZ7XpOwA_ktOhfkkaQQJQgkJudk3ZH_-ob36GQFv968nE1UBXxNekA9pIHBcvcl0ZWfwFhk-kyOF2FmQvpPY9LkqiCV0T32vhJet0n93ti2PBoFILxvChjzdOgSG9M0flH78Vm696Q4mHo7VMt_XMoHDTd3Rbagvt8")));
  console.log("private uncrypted: ",decrypt.decryptLong(urlsafeDecode("raoQQsfN0KBfPAMRWnxr9kFPvJ6BgQ7PRBCMnz0nWsH03sD4IdlMvKpj78BHe7V7Ga1HZHyDxuJhVaJ0T5qKl8qHXzvKquzNtdMru7G4X9o8ylzkGxJLg-HYCWOrsZ77ZMaKoV9p-TCf-yMI21OpL_5JGot-XNfVVPkmg0z9FW0")));

引入 <script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap