RSA加解密学习笔记

RSA加解密简单说明:

RSA是非对称加密方式,就是说加密解密不是同一个Key。私钥加密公钥解密,待加密的明文字节长度不能大于密钥的字节长度减11(比如1024位的,那么待加密的数据长度不能大于117字节),待解密数据的字节长度不能大于密钥的字节长度(比如1024位的就不能大于128字节)

RSA公钥私钥的生成:
//获取RSA密钥生成器的实例,还可以是DES/AES等,当然这里只需要RSA
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
//初始化密钥的长度
keyPairGenerator.initialize(2048);
//生成密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//获取私钥
PrivateKey privateKey = keyPair.getPrivate();
//获取公钥
PublicKey publicKey = keyPair.getPublic();
RSA公钥加密:
//从Base64编码的字符串生成公钥
String publicKeyStr = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQ"
byte[] publicKeyBytes = Base64.decodeBase64(publicKeyStr .getBytes());
//这里需要注意一下,生成公钥的spec只能是X509EncodedKeySpec或者RSAPublicKeySpec,私钥只能是PKCS8EncodedKeySpec或者RSAPrivateKeySpec
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes );
PublicKey publicKey = KeyFactory
                .getInstance("RSA")
                .generatePublic(keySpec);
//待加密数据
String content = "Hello RSA 77 Hello RSA 77Hello RSA 77Hello RSA 77Hello RSA 77Hello RSA 77Hello RSA 77Hello RSA 77Hello RSA";
byte[] data = Base64.encodeBase64(content.getBytes());
//公钥加密
Cipher rsa = Cipher.getInstance("RSA");
//初始化加密模式
rsa.init(Cipher.ENCRYPT_MODE, publicKey);
ByteArrayInputStream is = new ByteArrayInputStream(data );
ByteArrayOutputStream os = new ByteArrayOutputStream();
//这里是2048位密钥,所以加密最大长度不能超过245字节
byte[] buffer = new byte[245];
int len;
while ((len = is.read(buffer)) != -1) {
            byte[] doFinal = rsa.doFinal(buffer, 0, len);
            int length = doFinal.length;
            os.write(doFinal);
        }
//加密后的数据,为了防止乱码,这里将加密数据采用Base64编码
String encryptedData = new String(Base64.encodeBase64(os.toByteArray()));
RSA私钥解密:
         //从Base64编码的字符串生成私钥
        String privateKeyStr = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCDKI2SovlB9CcI/EztKXeiBQ5UMoGA";
        byte[] privateKey_bytes = Base64.decodeBase64(privateKeyStr.getBytes());
        //这里需要注意一下,生成公钥的spec只能是X509EncodedKeySpec或者RSAPublicKeySpec,私钥只能是PKCS8EncodedKeySpec或者RSAPrivateKeySpec
        PKCS8EncodedKeySpec sk_keySpec = new PKCS8EncodedKeySpec(privateKey_bytes);
        PrivateKey privateKey = KeyFactory
                .getInstance("RSA")
                .generatePrivate(sk_keySpec);
        //私钥解密
        Cipher rsa2 = Cipher.getInstance("RSA");
        rsa2.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] input = Base64.decodeBase64(encryptedData.getBytes());

        ByteArrayInputStream is2 = new ByteArrayInputStream(input);
        ByteArrayOutputStream os2 = new ByteArrayOutputStream();
        byte[] buffer2 = new byte[256];
        int len2;
        while ((len2 = is2.read(buffer2)) != -1) {
            byte[] doFinal = rsa2.doFinal(buffer2, 0, len2);
            os2.write(doFinal);
        }
        //解密后的数据
        String decryptData = new String(Base64.decodeBase64(os2.toByteArray()));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文主要介绍移动端的加解密算法的分类、其优缺点特性及应用,帮助读者由浅入深地了解和选择加解密算法。文中会包含算法的...
    苹果粉阅读 13,954评论 5 29
  • 姓名:于川皓 学号:16140210089 转载自:https://baike.baidu.com/item/RS...
    道无涯_cc76阅读 7,506评论 0 1
  • 嘟哝嘟哝:最近接到一个任务:在客户端动态生成RSA密钥对,然后向服务器发送这个密钥对中的公钥字符串,由服务器进行公...
    TimmyR阅读 12,470评论 19 21
  • 公钥密码系统及RSA公钥算法 本文简单介绍了公开密钥密码系统的思想和特点,并具体介绍了RSA算法的理论基础,工作原...
    火狼o阅读 9,766评论 2 15
  • 拍高中毕业照的时候,多么想躺在我们曾经经常一起喊减肥、跑步散步的地方,一大片绿幽幽的草地上,仰望着蔚蓝干净的天空,...
    梦若紫罗兰阅读 3,173评论 2 1