RSA-Base64

        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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值