{"id":21,"date":"2017-03-23T15:56:05","date_gmt":"2017-03-23T07:56:05","guid":{"rendered":"http:\/\/www.anthonylee.cn\/myblog\/?p=21"},"modified":"2018-03-08T16:15:02","modified_gmt":"2018-03-08T08:15:02","slug":"java-rsa-%e5%af%86%e9%92%a5%e7%94%9f%e6%88%90%e3%80%81%e5%8a%a0%e5%af%86%e3%80%81%e8%a7%a3%e5%af%86","status":"publish","type":"post","link":"http:\/\/www.anthonylee.cn\/myblog\/?p=21","title":{"rendered":"java RSA \u5bc6\u94a5\u751f\u6210\u3001\u52a0\u5bc6\u3001\u89e3\u5bc6"},"content":{"rendered":"<p>\u53c2\u8003\u4e86\u4e00\u4e9b\u4ee3\u7801\uff0c\u6574\u5408\u4e86\u4e0b\uff0c\u652f\u6301\u5206\u6bb5\u52a0\u5bc6\uff0c\u652f\u6301\u4e2d\u6587\u3002<\/p>\n<p>\u52a0\u5bc6\u6b65\u9aa4\u5927\u6982\u662f\u8fd9\u6837<\/p>\n<p>1.base64\u89e3\u5bc6\u516c\u94a5\u5b57\u7b26\u4e32<\/p>\n<p>2.\u751f\u6210\u516c\u94a5\u5bf9\u8c61<\/p>\n<p>3.\u660e\u6587\u8f6c\u6210\u5b57\u8282\u5206\u6bb5\u52a0\u5bc6\u5728\u62fc\u63a5<\/p>\n<p>4.\u5bc6\u6587\u5b57\u8282base64\u52a0\u5bc6\uff0c\u751f\u6210\u5bc6\u6587\u5b57\u7b26\u4e32<\/p>\n<p>&nbsp;<\/p>\n<p>\u89e3\u5bc6\u8fc7\u7a0b\u53cd\u5e8f~<\/p>\n<p>&nbsp;<\/p>\n<p>\u5982\u679c\u662fandroid\u8bf7\u628a\u5bf9\u5e94\u4ee3\u7801\u66ff\u6362\u6210\uff1a<\/p>\n<p>Cipher cipher = Cipher.getInstance(&#8220;RSA\/ECB\/NoPadding&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">package security;\r\n\r\nimport java.security.KeyFactory;\r\nimport java.security.KeyPair;\r\nimport java.security.KeyPairGenerator;\r\nimport java.security.NoSuchAlgorithmException;\r\nimport java.security.interfaces.RSAPrivateKey;\r\nimport java.security.interfaces.RSAPublicKey;\r\nimport java.security.spec.PKCS8EncodedKeySpec;\r\nimport java.security.spec.X509EncodedKeySpec;\r\nimport java.util.HashMap;\r\n\r\nimport javax.crypto.Cipher;\r\n\r\nimport sun.misc.BASE64Decoder;\r\nimport sun.misc.BASE64Encoder;\r\n\r\npublic class RSACode {\r\npublic static final String KEY_ALGORITHM = &quot;RSA&quot;;\r\nprivate static final String PUBLIC_KEY = &quot;RSAPublicKey&quot;;\r\nprivate static final String PRIVATE_KEY = &quot;RSAPrivateKey&quot;;\r\nprivate static final int KEY_LEN = 1024;\r\n\r\n\/**\r\n&lt;ul&gt;\r\n \t&lt;li&gt;\u751f\u6210\u516c\u94a5\u548c\u79c1\u94a5\r\n*&lt;\/li&gt;\r\n \t&lt;li&gt;@throws Exception\r\n*&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\n*\r\n*\/\r\npublic static void getAllKeyString() throws Exception {\r\nHashMap&amp;lt;String, Object&amp;gt; keyMap = getKeys();\r\n\/\/ \u751f\u6210\u516c\u94a5\u548c\u79c1\u94a5\r\nRSAPublicKey publicKey = (RSAPublicKey) keyMap.get(PUBLIC_KEY);\r\nRSAPrivateKey privateKey = (RSAPrivateKey) keyMap.get(PRIVATE_KEY);\r\n\r\n\/\/ \u6a21\r\nString modulus = publicKey.getModulus().toString();\r\nSystem.out.println(&quot;\u6a21:&quot; + modulus);\r\n\/\/ \u516c\u94a5\u6307\u6570\r\nString public_exponent = publicKey.getPublicExponent().toString();\r\nSystem.out.println(&quot;\u516c\u94a5\u6307\u6570:&quot; + public_exponent);\r\nSystem.out.println(&quot;\u516c\u94a5:&quot; + encryptBASE64(publicKey.getEncoded()));\r\n\/\/ \u79c1\u94a5\u6307\u6570\r\nString private_exponent = privateKey.getPrivateExponent().toString();\r\nSystem.out.println(&quot;\u79c1\u94a5\u6307\u6570:&quot; + private_exponent);\r\nSystem.out.println(&quot;\u79c1\u94a5:&quot; + encryptBASE64(privateKey.getEncoded()));\r\n}\r\n\r\n\/**\r\n&lt;ul&gt;\r\n \t&lt;li&gt;\u751f\u6210\u516c\u94a5\u548c\u79c1\u94a5\r\n*&lt;\/li&gt;\r\n \t&lt;li&gt;@throws NoSuchAlgorithmException\r\n*&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\n*\/\r\nprivate static HashMap&amp;lt;String, Object&amp;gt; getKeys() throws NoSuchAlgorithmException {\r\nHashMap&amp;lt;String, Object&amp;gt; keyMap = new HashMap&amp;lt;String, Object&amp;gt;();\r\nKeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);\r\nkeyPairGen.initialize(KEY_LEN);\r\nKeyPair keyPair = keyPairGen.generateKeyPair();\r\nRSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();\r\nRSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();\r\nkeyMap.put(PUBLIC_KEY, publicKey);\r\nkeyMap.put(PRIVATE_KEY, privateKey);\r\nreturn keyMap;\r\n}\r\n\r\n\/**\r\n&lt;ul&gt;\r\n \t&lt;li&gt;\u7528\u516c\u94a5\u52a0\u5bc6\r\n*&lt;\/li&gt;\r\n \t&lt;li&gt;@param data&lt;\/li&gt;\r\n \t&lt;li&gt;\u52a0\u5bc6\u6570\u636e&lt;\/li&gt;\r\n \t&lt;li&gt;@param key&lt;\/li&gt;\r\n \t&lt;li&gt;\u901a\u8fc7base64\u52a0\u5bc6\u7684\u5bc6\u94a5&lt;\/li&gt;\r\n \t&lt;li&gt;@return&lt;\/li&gt;\r\n \t&lt;li&gt;@throws Exception\r\n*\/&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\npublic static String encryptByPublicKey(String data, String key) throws Exception {\r\n\/\/ \u5bf9\u516c\u94a5\u5b57\u7b26\u4e32\u89e3\u5bc6\r\nbyte[] keyBytes = decryptBASE64(key);\r\n\/\/ \u53d6\u516c\u94a5\r\nX509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);\r\nKeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);\r\nRSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(x509EncodedKeySpec);\r\n\/\/ \u5bf9\u6570\u636e\u52a0\u5bc6\r\nString result = encryptByPublicKey(data.getBytes(), publicKey);\r\n\r\nreturn result;\r\n}\r\n\r\n\/**\r\n&lt;ul&gt;\r\n \t&lt;li&gt;\u7528\u79c1\u94a5\u89e3\u5bc6\r\n*&lt;\/li&gt;\r\n \t&lt;li&gt;@param data&lt;\/li&gt;\r\n \t&lt;li&gt;\u52a0\u5bc6\u6570\u636e&lt;\/li&gt;\r\n \t&lt;li&gt;@param key&lt;\/li&gt;\r\n \t&lt;li&gt;\u901a\u8fc7base64\u52a0\u5bc6\u7684\u5bc6\u94a5&lt;\/li&gt;\r\n \t&lt;li&gt;@return&lt;\/li&gt;\r\n \t&lt;li&gt;@throws Exception\r\n*\/&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\npublic static String decryptByPrivateKey(String data, String key) throws Exception {\r\n\/\/ \u5bf9\u79c1\u94a5\u5b57\u7b26\u4e32\u89e3\u5bc6\r\nbyte[] buffer = decryptBASE64(key);\r\n\/\/\u83b7\u53d6\u79c1\u94a5\r\nPKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);\r\nKeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);\r\nRSAPrivateKey privateKey = (RSAPrivateKey) keyFactory.generatePrivate(keySpec);\r\n\/\/\u5bc6\u6587base64\u89e3\u5bc6\r\nbyte[] data1 = decryptBASE64(data);\r\n\/\/ \u5bf9\u6570\u636e\u89e3\u5bc6\r\nString result = decryptByPrivateKey(data1, privateKey);\r\nreturn result;\r\n}\r\n\r\n\/**\r\n&lt;ul&gt;\r\n \t&lt;li&gt;\u516c\u94a5\u52a0\u5bc6\r\n*&lt;\/li&gt;\r\n \t&lt;li&gt;@param data&lt;\/li&gt;\r\n \t&lt;li&gt;@param publicKey&lt;\/li&gt;\r\n \t&lt;li&gt;@return&lt;\/li&gt;\r\n \t&lt;li&gt;@throws Exception\r\n*\/&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\nprivate static String encryptByPublicKey(byte[] data, RSAPublicKey publicKey) throws Exception {\r\nCipher cipher = Cipher.getInstance(KEY_ALGORITHM);\r\ncipher.init(Cipher.ENCRYPT_MODE, publicKey);\r\n\/\/ \u6a21\u957f\r\nint key_len = publicKey.getModulus().bitLength() \/ 8;\r\nString mi = &quot;&quot;;\r\nbyte ming1[] = {};\r\n\/\/ \u52a0\u5bc6\u6570\u636e\u957f\u5ea6 &amp;lt;= \u6a21\u957f-11\r\nbyte[][] arrays = splitArray(data, key_len - 11);\r\nfor (byte[] arr : arrays) {\r\nming1 = byteMerger(ming1,cipher.doFinal(arr));\r\n}\r\n\/\/ }\r\nmi = encryptBASE64(ming1);\r\nreturn mi;\r\n}\r\n\r\n\/**\r\n&lt;ul&gt;\r\n \t&lt;li&gt;\u79c1\u94a5\u89e3\u5bc6\r\n*&lt;\/li&gt;\r\n \t&lt;li&gt;@param data&lt;\/li&gt;\r\n \t&lt;li&gt;@param privateKey&lt;\/li&gt;\r\n \t&lt;li&gt;@return&lt;\/li&gt;\r\n \t&lt;li&gt;@throws Exception\r\n*\/&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\nprivate static String decryptByPrivateKey(byte[] data, RSAPrivateKey privateKey) throws Exception {\r\nCipher cipher = Cipher.getInstance(KEY_ALGORITHM);\r\ncipher.init(Cipher.DECRYPT_MODE, privateKey);\r\n\/\/ \u6a21\u957f\r\nint key_len = privateKey.getModulus().bitLength() \/ 8;\r\n\/\/ \u5982\u679c\u5bc6\u6587\u957f\u5ea6\u5927\u4e8e\u6a21\u957f\u5219\u8981\u5206\u7ec4\u89e3\u5bc6\r\nString ming = &quot;&quot;;\r\nbyte ming1[] = {};\r\nbyte[][] arrays = splitArray(data, key_len);\r\nfor (byte[] arr : arrays) {\r\nming1 = byteMerger(ming1,cipher.doFinal(arr));\r\n}\r\nming = new String(ming1);\r\nreturn ming;\r\n}\r\n\r\n\/\/java \u5408\u5e76\u4e24\u4e2abyte\u6570\u7ec4\r\npublic static byte[] byteMerger(byte[] byte_1, byte[] byte_2){\r\nbyte[] byte_3 = new byte[byte_1.length+byte_2.length];\r\nSystem.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);\r\nSystem.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);\r\nreturn byte_3;\r\n}\r\n\r\n\/**\r\n&lt;ul&gt;\r\n \t&lt;li&gt;\u62c6\u5206\u6570\u7ec4\r\n*\/&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\npublic static byte[][] splitArray(byte[] data, int len) {\r\nint x = data.length \/ len;\r\nint y = data.length % len;\r\nint z = 0;\r\nif (y != 0) {\r\nz = 1;\r\n}\r\nbyte[][] arrays = new byte[x + z][];\r\nbyte[] arr;\r\nfor (int i = 0; i &amp;lt; x + z; i++) {\r\narr = new byte[len];\r\nif (i == x + z - 1 &amp;amp;&amp;amp; y != 0) {\r\nSystem.arraycopy(data, i * len, arr, 0, y);\r\n} else {\r\nSystem.arraycopy(data, i * len, arr, 0, len);\r\n}\r\narrays[i] = arr;\r\n}\r\nreturn arrays;\r\n}\r\n\r\npublic static byte[] decryptBASE64(String key) throws Exception {\r\nreturn (new BASE64Decoder()).decodeBuffer(key);\r\n}\r\n\r\npublic static String encryptBASE64(byte[] key) throws Exception {\r\nreturn (new BASE64Encoder()).encodeBuffer(key);\r\n}\r\n\r\npublic static void main(String[] args) throws Exception {\r\nString publicKey = &quot;\u4f60\u7684\u516c\u94a5\u5b57\u7b26\u4e32&quot;;\r\nString privateKey = &quot;\u4f60\u7684\u79c1\u94a5\u5b57\u7b26\u4e32&quot;;\r\nString ming =&quot;\u3010\u661f\u7237\u72b6\u544a\u534e\u8c0a\u5144\u5f1f \u8ffd\u8ba8\u300a\u897f\u6e38\u964d\u9b54\u7bc7\u300b8610\u4e07\u7968\u623f\u5206\u7ea2\u3011\u4e3a\u8ba8\u8981\u300a\u897f\u6e38\u964d\u9b54\u7bc7\u300b\u768412.48\u4ebf\u5143\u7968\u623f\u5206\u7ea2,\u9999\u6e2f\u5f71\u661f\u5468\u661f\u9a70\u65d7\u4e0b\u516c\u53f8\u5c06\u534e\u8c0a\u5144\u5f1f\u544a\u4e0a\u6cd5\u5ead\u3002\u4f46\u534e\u8c0a\u5144\u5f1f\u5728\u6cd5\u5ead\u4e0a\u8868\u793a,\u8be5\u7247\u5b9e\u9645\u7968\u623f\u5e76\u975e\u516c\u4f17\u8ba4\u4e3a\u7684\u90a3\u4e48\u591a,\u201c\u5b9e\u9645\u7968\u623f\u4e0d\u8d85\u8fc75\u4ebf\u5143\u3002&quot;;\r\n\/\/ \u52a0\u5bc6\u540e\u7684\u5bc6\u6587\r\nString mi = encryptByPublicKey(ming, publicKey);\r\nSystem.out.println(mi);\r\n\/\/ \u89e3\u5bc6\u540e\u7684\u660e\u6587\r\nString unmi = decryptByPrivateKey(mi, privateKey);\r\nSystem.out.println(unmi);\r\n}\r\n}\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u53c2\u8003\u4e86\u4e00\u4e9b\u4ee3\u7801\uff0c\u6574\u5408\u4e86\u4e0b\uff0c\u652f\u6301\u5206\u6bb5\u52a0\u5bc6\uff0c\u652f\u6301\u4e2d\u6587\u3002 \u52a0\u5bc6\u6b65\u9aa4\u5927\u6982\u662f\u8fd9\u6837 1.base64\u89e3\u5bc6\u516c\u94a5\u5b57\u7b26&hellip; <a href=\"http:\/\/www.anthonylee.cn\/myblog\/?p=21\" class=\"more-link read-more\" rel=\"bookmark\">\u7ee7\u7eed\u9605\u8bfb <span class=\"screen-reader-text\">java RSA \u5bc6\u94a5\u751f\u6210\u3001\u52a0\u5bc6\u3001\u89e3\u5bc6<\/span><i class=\"fa fa-arrow-right\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"http:\/\/www.anthonylee.cn\/myblog\/index.php?rest_route=\/wp\/v2\/posts\/21"}],"collection":[{"href":"http:\/\/www.anthonylee.cn\/myblog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.anthonylee.cn\/myblog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.anthonylee.cn\/myblog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.anthonylee.cn\/myblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=21"}],"version-history":[{"count":1,"href":"http:\/\/www.anthonylee.cn\/myblog\/index.php?rest_route=\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":22,"href":"http:\/\/www.anthonylee.cn\/myblog\/index.php?rest_route=\/wp\/v2\/posts\/21\/revisions\/22"}],"wp:attachment":[{"href":"http:\/\/www.anthonylee.cn\/myblog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.anthonylee.cn\/myblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.anthonylee.cn\/myblog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}