RSA简介
RSA算法是一种非对称加密算法,常被用于加密传输数据。如果配合数字摘要算法,也可用于文件签名。RSA算法有2个作用一个是加密一个是加签。我们第一种是使用公钥能在客户端:加密数据,以及服务器端用私钥解密。 第二个就是用私钥在客户端加签,然后用公钥在服务器端用公钥验签。第一种完全是为了加密,第二种是为了放抵赖,就是为了防止别人模拟我们的客户端来攻击我们的服务器,导致瘫痪。
RSA 基本原理
RSA使用 “秘钥对儿
” 对数据进行加密解密,在加密解密数据前需要先生成公钥(publick key) 和私钥(private key)。* 公钥:用于加密数据。用于公开,一般存放在数据提供方;* 私钥:用于解密数据。必需保密,私钥泄露会造成安全问题。
Java端: 密钥的来源:
- KeyPairGenerator 生成密钥对儿
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
- 调用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();
- 对上一步生成的 公钥和私钥,调用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
- 对公钥base64解码
byte[] keyBytes = decryptBASE64(key);
- 取得公钥(这里是x509 standard,和前面的格式相对应)
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
- 调用Cipher对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
Java端:解密过程(私钥解密)decryptByPrivateKey
- 对私钥 base64 解码
byte[] keyBytes = decryptBASE64(key);
- 取得私钥(pkcs8格式)
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
- 对数据解密
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
。
网友评论