RSA:
1. 加签:用私钥加签,对方用公钥验签(防抵赖,私钥只有自己有!)
2. 加密:用对方公钥加密,对方用对应私钥解密(加密)
RSA使用“密钥对”对数据进行加密解密,在加密解密前需要先生存公钥(Public Key)和私钥(Private Key)。
公钥(Public key): 用于加密数据. 用于公开, 一般存放在数据提供方, 例如iOS客户端。
私钥(Private key): 用于解密数据. 必须保密, 私钥泄露会造成安全问题。
如何生成RSA公钥私钥
生成类似支付宝的1024位私钥
openssl genrsa -out private_key.em 1024
生成certification require file
openssl req -new -key private_key.pem -out rsaCertReq.csr
CSR文件必须有CA的签名才可形成证书 并指定过期时间
openssl x509 -req -days 365 -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt
生成公钥供iOS使用
openssl x509 -outform der -in rsaCert.crt -out public_key.der
生成pkcs12文件,但不包含CA证书.生成私钥供iOS使用
openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt
生成pem结尾的公钥供Java使用
openssl rsa -in private_key.pem -out rsa_public_key.pem -pubout
生成pem结尾的私钥供Java使用
openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt
RSA签名
- (void)RSA{
_rsa = [XYRSACryption new];
// 加载公钥
NSString *derPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"public_key" ofType:@"der"];
[_rsa loadPublicKeyFromFile:derPath];
// 加载私钥
NSString *p12Path = [[NSBundle bundleForClass:[self class]] pathForResource:@"private_key" ofType:@"p12"];
[_rsa loadPrivateKeyFromFile:p12Path password:privateKey];
NSString *enStr = @"哈哈哈哈哈哈哈哈哈哈哈哈哈!";
// 加密后的数据
NSData *enData = [_rsa rsaEncryptData:
[enStr dataUsingEncoding:NSUTF8StringEncoding]];
// 解密后的数据
NSData *deData = [_rsa rsaDecryptData:enData];
NSString *deStr = [[NSString alloc] initWithData:deData encoding:NSUTF8StringEncoding];
NSLog(@"%@,%@",enStr, deStr);
// 签名
NSData *signedData = [_rsa sha256WithRSA:enData];
// 对前面进行验证
BOOL result = [_rsa rsaSHA256VertifyingData:enData withSignature:signedData];
if (result) {
NSLog(@"验签成功");
}else{
NSLog(@"验签失败");
}
}