对OpenSSL RSA加解密的封装请移步到:
https://github.com/reference/OpenSSLRSAWrapper
本例子只是一个说明。
大家都清楚在ios上是存在加解密api,库是调用security,一般只用来公钥加密,私钥解密。用途局限,但是一旦反过来便不支持了。也便是大家常说的数字认证签名功能(很容易跟RSA加解密的基本功能混淆)。
1、Openssl --RSA加密算法的使用。
这两天简单的学习了一下openssl的使用。相关的介绍,可以在网上搜,挺多的。有些容易迷糊的概念,例如加密与身份验证,什么时候用公钥加密,什么时候用私钥。如果学习过密码学,应该很简单理解,我没学过,刚理解了些,赶紧记下,以防忘记。
用大家熟知C-S结构分析下吧:
首先请注意,公钥和私钥是一配一的,一个公钥对应一个私钥。
1)加密
客户和服务器通信,服务器要保证与客户通信的数据被保密,所以服务器会给客户一个公钥,客户用此公钥将自己的数据加密。然后将加密后的数据发给服务器,服务器用自己的私钥解开密文还原成真的数据。公钥是可以公开的,没有必要保护它,因为你能用它加密,但是加密后,没有私钥,你确是无法解密的。即你没法解开别人用此公钥加密的数据。你也就无法知道别人的数据。
2)身份验证
有时候服务器需要确定客户端的身份,所以需要客户端发送唯一的自己的标识,让服务器确定自己的身份。如何发呢?这就用的到私钥了。首先需要客户端用自己的私钥将特征码加密后,将此数据发给服务器,服务器将使用你的公钥对密文进行解密,如果解密成功可唯一确定这是用你的私钥加密的密文。只要你不泄露私钥,那么使用私钥的人肯定是你。其实这个逻辑挺简单的。
简单地做了一个例子。
const char * input = "fffffff fffff==\"~!@#$^ &* ()-_=+|?/.,`%%\"";
RSA *_rsa = RSA_generate_key(1024,RSA_F4,NULL,NULL);
//encrypt with private key
int flen = RSA_size(_rsa);
char *encData = (char *)malloc(flen);
bzero(encData, flen);
//encrypt
int status = RSA_private_encrypt(flen,
(unsigned char*)input,
(unsigned char*)encData,
_rsa,
RSA_NO_PADDING);
if (status) {
NSData *data = [NSData dataWithBytes:encData length:status];
flen = RSA_size(_rsa);
char *decData = (char *)malloc(flen);
bzero(decData, flen);
//decrypt
status = RSA_public_decrypt(flen,
(unsigned char*)[data bytes],
(unsigned char*)decData,
_rsa,
RSA_NO_PADDING);
if (status) {
NSLog(@"\n ------------\ndecData is %s\n---------------\n",decData);
}else
NSLog(@"----error RSA_public_decrypt");
free(decData);
encData = NULL;
}else
NSLog(@"----error RSA_private_encrypt");
free(encData);
encData = NULL;
分享到:
相关推荐
encrypt-decrypt-file-using-openssl encrypt & decrypt file using openssl 生成私钥: openssl genrsa -out private.pem 2048 生成公钥: openssl rsa -in private.pem -pubout > public.pem 在Linux下的编译:gcc...
使用OpenSSL-RSA加密解密 什么是OpenSSL? OpenSSL是开放源代码库,可使用TLS(传输安全层)和SSL(安全套接字层)在网络上提供安全通信。 它支持许多加密算法AES,DSA,RSA,SHA1,SHA2,MD5。。有关更多信息 什么...
4、RSA publicKey Encrypt 和 RSA privateKey Decrypt 5、RSA sign 和 RSA verify: MD5、SHA1、SHA256、SHA512 以上函数为常用,如支付宝支付和微信支付都可用到, openSSL动态链接库:可从我的另外一个上传资源或...
// C/C++, 利用OpenSSL库对Socket传输进行安全加密(RSA+AES) // 1. 利用RSA安全传输AES生成密钥所需的Seed(32字节) // 2. 利用AES_encrypt/AES_decrypt对Socket上面的业务数据进行AES加密/解密 // --- // * 理论上只...
// 利用OpenSSL库对Socket传输进行安全加密(RSA+AES) // 1. 利用RSA传输AES生成密钥所需的Seed(32字节BUF) // 2. 利用AES_encrypt/AES_decrypt对Socket上面的数据报文进行AES对称性加密 // --- // * 理论上只需要AES...
A demo of openssl encrypt & decrypt using RSA, signature & verify using sha1. The demo simulate the complete process of signature-encrypt-decrypt-verify. 这是网络安全课程的某次作业,作业要求是利用...
以DER格式创建公共和私有RSA密钥 let (privateKey, publicKey) = try! CC.RSA.generateKeyPair...或加密,解密私钥(与OpenSSL兼容) try SwKeyConvert.PrivateKey.encryptPEM(privateKeyPEM, passphrase: "longpasswo
基于openssl写的测试例子,密钥是自己生成的RSA密钥,用EVP_PKEY_encrypt和EVP_PKEY_decrypt加解密。
用法API很简单,用法也很简单: require "block64"key = OpenSSL::PKey::RSA::new()encoded = key.encrypt64()decoded = key.decrypt64(encoded)版权版权所有:copyright:2007 Bart Teeuwisse和:copyright:2010 – ...
该库实现了S / MIME处理程序,该处理程序可以在AES-128 / 192/256 CBC / OFB模式下使用公共RSA密钥对S / MIME消息进行加密和解密。 它还可以签名和验证S / MIME消息。 该库实现了CAdES-B处理程序,用于以Adobe....