美文网首页
RSA 加密解密

RSA 加密解密

作者: 横渡 | 来源:发表于2016-06-02 14:05 被阅读421次

    RSA简介

    RSA算法是一种非对称加密算法,常被用于加密传输数据。如果配合数字摘要算法,也可用于文件签名。RSA算法有2个作用一个是加密一个是加签。我们第一种是使用公钥能在客户端:加密数据,以及服务器端用私钥解密。 第二个就是用私钥在客户端加签,然后用公钥在服务器端用公钥验签。第一种完全是为了加密,第二种是为了放抵赖,就是为了防止别人模拟我们的客户端来攻击我们的服务器,导致瘫痪。

    RSA 基本原理

    RSA使用 “秘钥对儿” 对数据进行加密解密,在加密解密数据前需要先生成公钥(publick key) 和私钥(private key)。* 公钥:用于加密数据。用于公开,一般存放在数据提供方;* 私钥:用于解密数据。必需保密,私钥泄露会造成安全问题。

    Java端: 密钥的来源:

    1. KeyPairGenerator 生成密钥对儿
    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
    keyPairGen.initialize(1024);
    KeyPair keyPair = keyPairGen.generateKeyPair();
    
    1. 调用Key 中的getEncoded() 方法
    // 注:如果是公钥,返回 X.509 standard 
    Key key = (Key) keyMap.get(PUBLIC_KEY);
    key.getEncoded();
    // 如果是私钥,返回 PKCS #8 standard
    Key key = (Key) keyMap.get(PRIVATE_KEY);
    key.getEncoded();
    
    1. 对上一步生成的 公钥和私钥,调用Coder的 encryptBASE64方法
    // 公钥
    Key key = (Key) keyMap.get(PUBLIC_KEY);
    encryptBASE64(key.getEncoded());
    // 私钥
    Key key = (Key) keyMap.get(PRIVATE_KEY);
    encryptBASE64(key.getEncoded());
    

    注:base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码可用于HTTP环境下传递较长的标识信息。采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。

    Java端: 加密的过程(公钥加密)-encryptByPublickKey

    1. 对公钥base64解码
    byte[] keyBytes = decryptBASE64(key);
    
    1. 取得公钥(这里是x509 standard,和前面的格式相对应)
    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    Key publicKey = keyFactory.generatePublic(x509KeySpec);
    
    1. 调用Cipher对数据加密
    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    return cipher.doFinal(data);
    

    Java端:解密过程(私钥解密)decryptByPrivateKey

    1. 对私钥 base64 解码
    byte[] keyBytes = decryptBASE64(key);
    
    1. 取得私钥(pkcs8格式)
    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
    
    1. 对数据解密
    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateKey);
    return cipher.doFinal(data);
    

    iOS端

    iOS中的 Security.framework提供了对RSA算法的支持,这种方式需要对密钥进行处理,根据 publick key 生成证书,通过private key 生成p12(pkcs12)格式的密匙。问题的关键在于java端对私钥的编码格式是 pkcs8,而在iOS端需要它的格式是 pkcs12

    相关文章

      网友评论

          本文标题:RSA 加密解密

          本文链接:https://www.haomeiwen.com/subject/xmkkdttx.html