呵呵呵呵呵

萝莉有三好,柔体 轻音 易推倒。女神有三宝,干嘛 呵呵 去洗澡。宅男有三好:Dota 基友 破电脑。


使用openssl对网络传输的数据加密方法

使用openssl对网络传输的数据加密方法

 openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密。可 以使用非对称加密:公钥加密,私钥解密。openssl提供了对RSA的支持,但RSA存在计算效率低的问题,所以一般的做法是使用对称密钥加密数据,然 后再把这个只在当前有效的临时生成的对称密钥用非对称密钥的公钥加密之后传递给目标方,目标方使用约定好的非对称密钥中的私钥解开,得到数据加密的密钥, 再进行数据解密,得到数据,这种使用方式很常见,可以认为是对HTTPS的裁剪。对称密钥加密可以选择AES,比DES更优秀。

利用OpenSSL库对Socket传输进行安全加密(RSA+AES)
 1. 利用RSA安全传输AES生成密钥所需的Seed(32字节)
 2. 利用AES_encrypt/AES_decrypt对Socket上面的业务数据进行AES加密/解密

 理论上只需要AES就能保证全部流程,但由于AES加密所需要的AES-KEY是一个结构。
     这个一个结构,如果通过网络进行传输,就需要对它进行网络编码,OpenSSL里面没有现成的API
所以就引入RSA来完成首次安全的传输,保证Seed不会被窃听。同样,只使用RSA也能完成全部流程,但由于RSA的处理效率比AES低,所以在业务数据传输加密上还是使用AES

 下面的代码包含了上述传输加密流程所需的所有步骤(OpenSSL部分)
 在实际的Socket应用开发时,需要将这些步骤插入到Client/Server网络通信的特定阶段

所需的OpenSSL主要的API及功能描述
 1. RSA_generate_key()    随机生成一个RSA密钥对,供RSA加密/解密使用
 2. i2d_RSAPublicKey()    将RSA密钥对里面的公钥提出到一个BUF,用于网络传输给对方
 3. d2i_RSAPublicKey()    将从网络传过来的公钥信息生成一个加密使用的RSA(它里面只有公钥)
 4. RSA_public_encrypt()  使用RSA的公钥对数据进行加密
 5. RSA_private_decrypt() 使用RSA的私钥对数据进行解密
 6. AES_set_encrypt_key() 根据Seed生成AES密钥对中的加密密钥
 7. AES_set_decrypt_key() 根据Seed生成AES密钥对中的解密密钥
 8. AES_encrypt()         使用AES加密密钥对数据进行加密
 9. AES_decrypt()         使用AES解密密钥对数据进行解密

 一个典型的安全Socket的建立流程, 其实就是如何将Server随机Seed安全发给Client
 C: Client   S:Server
 C: RSA_generate_key() --> RSAKey --> i2d_RSAPublicKey(RSAKey) --> RSAPublicKey
 C: Send(RSAPublicKey) TO Server
 S: Recv() --> RSAPublicKey --> d2i_RSAPublicKey(RSAPublicKey) --> RSAKey
 S: Rand() --> Seed --> RSA_public_encrypt(RSAKey, Seed) --> EncryptedSeed
 S: Send(EncryptedSeed) TO Client
 C: Recv() --> EncryptedSeed --> RSA_private_decrypt(RSAKey, EncryptedSeed) --> Seed
 --- 到此, Client和Server已经完成完成传输Seed的处理
 --- 后面的流程是它们怎样使用这个Seed来进行业务数据的安全传输
 C: AES_set_encrypt_key(Seed) --> AESEncryptKey
 C: AES_set_decrypt_key(Seed) --> AESDecryptKey
 S: AES_set_encrypt_key(Seed) --> AESEncryptKey
 S: AES_set_decrypt_key(Seed) --> AESDecryptKey
 --- Client传输数据给Server
 C: AES_encrypt(AESEncryptKey, Data) --> EncryptedData --> Send() --> Server
 S: Recv() --> EncryptedData -->  AES_decrypt(AESDecryptKey, EncryptedData) --> Data
 --- Server传输数据给Client
 S: AES_encrypt(AESEncryptKey, Data) --> EncryptedData --> Send() --> Client
 C: Recv() --> EncryptedData -->  AES_decrypt(AESDecryptKey, EncryptedData) --> Data

openssl库来自http://www.openssl.org/,下载到openssl源码之后,开始编译:
产生动态库的做法:
1、安装ActivePerl
2、进入OpenSSL所在文件夹,运行:perl Configure VC-WIN32 --prefix=C:\openssl-dll
3、进入VC/BIN目录,运行 VCVARS32.BAT 设置环境变量
4、返回OpenSSL目录,运行 ms\do_ms
5、在OpenSSL目录下执行编译 nmake -f ms\ntdll.mak
6、把必要生成物拷贝到prefix定义的目录中 nmake -f ms\ntdll.mak install
注意:可以通过修改ntdll.mak文件中的CFLAG,确定编译MT、MD库
产生静态库的做法:
1、安装ActivePerl
2、perl configure VC-WIN32 --prefix=C:\openssl-lib
3、ms\do_ms.bat
4、nmake -f ms\nt.mak
5、nmake -f ms\nt.mak install
注意:可以通过修改nt.mak文件中的CFLAG,确定编译MT、MD库。重编的时候把生成物删掉。

RSA加解密需要先用openssl工具生成RSA公钥和RSA私钥。方法:
1、产生私钥:openssl genrsa -out privkey.pem 1024;
2、根据私钥产生公钥:openssl rsa -in privkey.pem -pubout。
1024只是测试用,使用2048位才比较安全。

openssl.exe 可以用来生成 PEM 格式的 RSA 密钥对。

1、生成私钥pem,  执行命令openssl genrsa -out rsa_private_key.pem 1024
2、生成公钥,执行命令openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
3、将RSA私钥转换成PKCS8格式,命令执行openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt PHP服务端语言读取私钥不需要PKCS8转换。

更多内容:

ie 浏览器设置为不缓存
openssl rsa密钥生成示例
openssl rsa中PEM和BIGNUM公钥转换示例
openssl rsa编程数据加、密解密示例
ubuntu 交叉编译openssl-1.0.0b 移植到ARM Linux

本文链接地址:http://www.hehehehehe.cn/i/720.html