byte[] publicKeyBase64Bytes = ByteString.decodeBase64(publicKeyBase64).toByteArray();
//这里作用先把公钥变成字节
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKeyBase64Bytes);
//然后用X509EncodedKeySpec进行初始化;
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(x509EncodedKeySpec);
//变成我们真正可以是用的公钥
byte[] privateKeyBase64Bytes = ByteString.decodeBase64(privateKeyBase64).toByteArray();
//对于私钥也是这样变成字节
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKeyBase64Bytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(pkcs8EncodedKeySpec);
//变成代码可以使用的私钥
这里很显然我们能够使用的pkcs8都格式
关于私钥
pkcs1格式通常开头是-----BEGIN RSA PRIVATE KEY-----
pkcs8格式通常开头是-----BEGIN PRIVATE KEY-----
PublicKey publicKey = generatePublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzWfAPMAx/63hCCJAgoHD" +
"jLFNr05L5bZU4cq+HOIzjcXT45yuSA8QI3iCz/fDUfL/zqdj9KvbVAru8jnMGujP" +
"vn2X6DGKQgr9hei1/L4cUW61o/W3Z1HTuvCX56YViZJN5bwausTG5X1EAHGmURNS" +
"ixEMcFgjekVGovHmEsoIf8GpwgUPu2tvQceC8L5WbP0BgdfW0/U/GevGfhep73q5" +
"a2XpVkVeTE8TXWz6hXUl6bFmtPl4IRip0eE5UeUOs/JJ5u0hO3YZDqyIV6iq9xCd" +
"o8VjzEdGLrb1L4zNb+0U7vGjkpb3by2sgvsyhuBIfVz48vZHuedEO1iD8e12oWqe" +
"6wIDAQAB");
Cipher instance = Cipher.getInstance("RSA");
//用Cipher这个类调用RSA加密算法
instance.init(Cipher.ENCRYPT_MODE, publicKey);
//初始化
byte[] bytes = instance.doFinal("zhaocaimao".getBytes());
//然后加入明文zhaocaimao
//这上面的加密过程都是和AES一样的。
Log.d("zhaocaimao", "RSA bytes length: " + bytes.length);
ByteString of = ByteString.of(bytes);
String base64 = of.base64();
String hex = of.hex();
return base64 + "||" + hex;
用公钥加密后的密文是以下
QvDeH8eHcwgAu58Mp36BWvxHbtug9D2JQ57nAcAjq/NZ8OznUw1zX5ygkS0Qdd5ICqBW6HU5BAVyvEoNkT459rSdabMLxwprseJTVp3Vilb4zsoz75K9Q45F2g/zzPwNlk3+xjJBxBb0NwvHFTTeA3vAREKe6VdPDVErcYml04ZAOSYnQ43U9g9DAzaUXyoaMzhlYnLwHeAMOisKZrVhQctyLNaygfHwQm2lmbC2xtOEy7KiSqxUsgBPQyKkNAE+Pc1UrpnRu1NPVjAPeHldjvYEtE2l+QYFtTT9epf9T1PQUmvtS5dlx5J2sMr2iirYfXLetA5t6VNeudtjzTAsug==||42f0de1fc787730800bb9f0ca77e815afc476edba0f43d89439ee701c023abf359f0ece7530d735f9ca0912d1075de480aa056e87539040572bc4a0d913e39f6b49d69b30bc70a6bb1e253569dd58a56f8ceca33ef92bd438e45da0ff3ccfc0d964dfec63241c416f4370bc71534de037bc044429ee9574f0d512b7189a5d38640392627438dd4f60f430336945f2a1a3338656272f01de00c3a2b0a66b56141cb722cd6b281f1f0426da599b0b6c6d384cbb2a24aac54b2004f4322a434013e3dcd54ae99d1bb534f56300f78795d8ef604b44da5f90605b534fd7a97fd4f53d0526bed4b9765c79276b0caf68a2ad87d72deb40e6de9535eb9db63cd302cba
然后我们得到这个密文,我们用我们的私钥进行解码
PrivateKey privateKey = generatePrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDNZ8A8wDH/reEI\n" +
"IkCCgcOMsU2vTkvltlThyr4c4jONxdPjnK5IDxAjeILP98NR8v/Op2P0q9tUCu7y\n" +
"Ocwa6M++fZfoMYpCCv2F6LX8vhxRbrWj9bdnUdO68JfnphWJkk3lvBq6xMblfUQA\n" +
"caZRE1KLEQxwWCN6RUai8eYSygh/wanCBQ+7a29Bx4LwvlZs/QGB19bT9T8Z68Z+\n" +
"F6nverlrZelWRV5MTxNdbPqFdSXpsWa0+XghGKnR4TlR5Q6z8knm7SE7dhkOrIhX\n" +
"qKr3EJ2jxWPMR0YutvUvjM1v7RTu8aOSlvdvLayC+zKG4Eh9XPjy9ke550Q7WIPx\n" +
"7Xahap7rAgMBAAECggEBALg1cYuJ+c0IjSWUQjJIWa0VXUv4dcx+5kTQZArXOdDN\n" +
"N6eK3im1iI2nB/mmgz49JPiZ2eSVM099tqj4+HixjY2SaOdNdmagIJk1B/CwNgk5\n" +
"tiBivqYkFjQyjKiso+gKk12Sgo445v7shk23nqZbI82f7n3aLYb8FcsQEXuMQG8B\n" +
"Da1xKPFQuSmNcPO/dEcwwCj8986Dz5elf46kDdl8X3fGZCa55IDZ6H3ATqhkkGRk\n" +
"5GN4k0V3JimEJvwZie2QwaCz85p4aAOdN4kYGNNmNmDMt5FOGNCtmEbTAzFUQH4C\n" +
"+9Z50yy0sEFm0EqLBfObsn32ZTHZoB2u6R+z2n4JPrECgYEA7uN+fLUKGDIn5MI6\n" +
"+1/2o6XK7Qz8Rpd4AQSb+L0MHxtjnzhDcewWqm3cAGLzlB+1QUtF2YNsSo465XZC\n" +
"3YKAvkroEjICo1VIAWC2wCVLwd1hGWxH1edfOT772q1PltLTcDSmo1x0qqd/PArb\n" +
"IUivy8ax4h0hDpjAn6p3ZCB8BI0CgYEA3B5Fhm0fiFcAZgykRFipMWpc09gnKGOy\n" +
"S81/OhJNvU4pqkJlAmmMY9mRFHCh/Vo2gjjM+9gtREPSlDdYHptnvWodRmDRI7K7\n" +
"W1Y/o+Bhz8Qu2oV3evJaZ4Qu0KUn6GVLo77aliD+EQg4ksKIXHJasDpMGfZMDPTJ\n" +
"/LHArxuYH1cCgYAzFCeOiLNA2zCWhEVSTIGTGjcamqUyft6k8RRciieWWyfg+onJ\n" +
"SR7LkDPzTTUh3enGrU6hJK25/1FukOvZKzdV+PRIN7NCs1BzIvfQe+kH6csCQZnW\n" +
"jeNZfTMi3d3ftPKK0mczFOjJOIlHEFcsdbtJChIs8+eGlHjTawKeQSfjXQKBgFFa\n" +
"ptueLU9YyH7vIS9ZjX8EDrcFZsOYxWca1nECHtVetCuHSonvtMGawfJKBrT6yLas\n" +
"g6Z5KZHXd1bsdZcqXNc3Bwbh9ao5/uEtKWxKHByMJ70AIz6/oAYuZpca03sjJSep\n" +
"/GQMYZqt7Srg10FDypzjjwjxbP5E4vqQP+T4T+sVAoGAaTGmP9Vt4WbbRKsEwRu9\n" +
"pBkKABvM8UZx2F17SrrHbbaUu9dUtVC1Mt9f4hhfMa3gVhNdacHct7FT7zCWthEc\n" +
"CE2kxyg6ON7HoBzLdo6eAWjxiE+zPt+UXbV8ijq/RHyXEhVZbeU+w72DAN1o+Ftk\n" +
"JXH4MzmTuKvtcWTSq5ogLgI=");
byte[] cipherTextBytes = ByteString.decodeBase64(cipherText).toByteArray();
Cipher instance = Cipher.getInstance("RSA/ECB/NOPadding");
instance.init(Cipher.DECRYPT_MODE, privateKey);
byte[] bytes = instance.doFinal(cipherTextBytes);
String s = Arrays.toString(bytes);
Log.d("招财猫", "看看填充了什么 :" + s);
return new String(bytes);
看到我们得到了什么
因为我们用的是ECB模式,但是我们采集的公钥和私钥的方式是
请注意我们用的PKCS1,所以我们调整一下
实验失败,只能用PKCS8是报错的,加密都无法加密,但是用pkcs1确实可以
这里要主要能加密的密文是117个字节超过只能切块循环加密传送了。
如果是用Nopadding模式的话,那么明文和密文等长,没有用0来填充就是我们刚刚看到那种模式,用0来填充料
如果没有知名表示哪个模式的话,那就是nopadding