iOS RSA加密 以及生成公钥 秘钥 pem文件

在iOS中使用RSA加密解密,需要用到.der和.p12后缀格式的文件,其中.der格式的文件存放的是公钥(Public key)用于加密,.p12格式的文件存放的是私钥(Private key)用于解密. 首先需要先生成这些文件,然后再将文件导入工程使用,不多说,开始做!
一、使用openssl生成所需秘钥文件
  生成环境是在mac系统下,使用openssl进行生成,首先打开终端,按下面这些步骤依次来做:

  1. 生成模长为1024bit的私钥文件private_key.pem

openssl genrsa -out private_key.pem 1024
2. 生成证书请求文件rsaCertReq.csr
openssl req -new -key private_key.pem -out rsaCerReq.csr
注意:这一步会提示输入国家、省份、mail等信息,可以根据实际情况填写,或者全部不用填写,直接全部敲回车.
3. 生成证书rsaCert.crt,并设置有效时间为10年
openssl x509 -req -days 3650 -in rsaCerReq.csr -signkey private_key.pem -out rsaCert.crt
4. 生成供iOS使用的公钥文件public_key.der
openssl x509 -outform der -in rsaCert.crt -out public_key.der
5. 生成供iOS使用的私钥文件private_key.p12
openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt
注意:这一步会提示给私钥文件设置密码,直接输入想要设置密码即可,然后敲回车,然后再验证刚才设置的密码,再次输入密码,然后敲回车,完毕!
在解密时,private_key.p12文件需要和这里设置的密码配合使用,因此需要牢记此密码.
6. 生成供Java使用的公钥rsa_public_key.pem
openssl rsa -in private_key.pem -out rsa_public_key.pem -pubout
7. 生成供Java使用的私钥pkcs8_private_key.pem
openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt
全部执行成功后,会生成如下文件,其中public_key.der和private_key.p12就是iOS需要用到的文件

10/10/2018 15:11 下午 posted in  Crypto

使用openssl命令制作ecc证书

# openssl ecparam -out EccCA.key -name prime256v1 -genkey
# openssl req -config openssl.cnf -key EccCA.key -new -out EccCA.req
# openssl x509 -req -in EccCA.req -signkey EccCA.key -out EccCA.pem
# openssl ecparam -out EccSite.key -name prime256v1 -genkey
# openssl req -config openssl.cnf -key EccSite.key -new -out EccSite.req
# openssl x509 -req -in EccSite.req -CA EccCA.pem -CAkey EccCA.key -out EccSite.pem -CAcreateserial

生成几张用户证书,然后用openssl pkcs12命令生成p12格式证书文件,然后导入到firefox中。
生成证书时,ECC曲线选择的是prime256v1。之前有选过prime192v1,好像firefox不认,改了种曲线就好了。
生成站点证书或用户证书时,也可以用ECC根证书颁发RSA证书,测试一样能通过。

将私钥秘cer证书合并成p12格式

1)生成pkcs12文件,但不包含CA证书:

openssl pkcs12 -export -inkey ocspserverkey.pem -in ocspservercert.pem -out ocspserverpkcs12.pfx

2) 生成pcs12文件,包含CA证书:

openssl pkcs12 -export -inkey server.key -in server.crt -CAfile ca.crt -chain -out server.pfx

3) 将pcks12中的信息分离出来,写入文件:

openssl pkcs12 –in ocsp1.pfx -out certandkey.pem

4) 显示pkcs12信息:

openssl pkcs12 –in ocsp1.pfx -info


附: 1、把cert1.pem转换成.p12格式

openssl pkcs12 -export -in cert1.pem -inkey cert1.key -certfile ca.pem -out cert1.p12

2、把cert1.pem转换成.cer格式:只需把扩展名改为.cer即可.

10/10/2018 15:08 下午 posted in  Crypto

关于ECDSA/ECC(密钥加密传输)和ECDSA/ECDH(密钥磋商)

ECC:Elliptic Curves Cryptography,椭圆曲线密码编码学
ECDSA:用于数字签名,是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。
ECDH:是基于ECC(Elliptic Curve Cryptosystems,椭圆曲线密码体制,参看ECC)的DH( Diffie-Hellman)密钥交换算法。交

重点说一下,ECDH用途:
由于通过ECDH,双方可以在不共享任何秘密的前提下协商出一个共享秘密,因此,ECDH广泛用于协议之中,通过ECDH得到对称加密密钥。如TLS中的*ECDH*密码套件。使用DH算法的协议,都可以升级到ECDH算法。ECDH具有ECC的高强度、短密钥长度、计算速度快等优点。

密钥交换过程:
假设密钥交换双方为Alice、Bob,其有共享曲线参数(椭圆曲线E、阶N、基点G)。
1.Alice生成随机整数a,计算A=a*G。Bob生成随机整数b,计算B=b*G
2.Alice将A传递给Bob。A的传递可以公开,即攻击者可以获取A。由于椭圆曲线的离散对数问题是难题,所以攻击者不可以通过A、G计算出a。Bob将B传递给Alice。同理,B的传递可以公开。
3.Bob收到Alice传递的A,计算Q=b*A
4.Alice收到Bob传递的B,计算Q‘=a*B总结:
  Alice、Bob双方即得Q=b*A=b*(a*G)=(b*a)*G=(a*b)*G=a*(b*G)=a*B=Q (交换律和结合律),即双方得到一致的密钥Q。

10/10/2018 13:38 下午 posted in  Crypto