当前位置:文档之家› 证书, ssl,CA加密与解密实战例子

证书, ssl,CA加密与解密实战例子

加密与解密研究学习编写:laichOpenssl RSA 加密与解密理论RSA是什么:RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。

RSA取名来自开发他们三者的名字。

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。

目前该加密方式广泛用于网上银行、数字签名等场合。

RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

OpenSSL是什么:众多的密码算法、公钥基础设施标准以及SSL协议,或许这些有趣的功能会让你产生实现所有这些算法和标准的想法。

实践操作以Java为例这是windos7 下Openssl 路径:C:\openssl\binopenssl version -a先来生成私钥:openssl genrsa -out rsa_private_key.pem 1024会在bin 目录下生成rsa_private_key.pem生成的内容:-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQDbJkpMThepmY82P4wYACp1OB8e8zE66tGfTpfIQu5a/29O8KkQ UklbVgPKh+rNZHFT6srrr0sFEpbIc0CZc75S4aXd58K9+smVcizgijzKC+y47ggf zVBhXHsaEvEcH+IMAW7VKZ4rhdydYUgP+i+XmBTyhXc9cBhR2LoAuS/mDwIDAQAB AoGABKh2sdKDHD7AVYXaQ3RVcrJjrvO6Wyc8l2dDQKVzjYmaYxIodclZ99AHOpnS+tSkuATolUPfk1cGz3HrsJdON0i02E/44U5DY1gVM1YJdJ5Wxwty1Hd57ph96yjycmH1Vl0UMRB4Cmaq0bYzpnmv0Ks1+nvMIacl8sE17RYHxqkCQQDtwkbgDHxb9o2E osy/7qCIapSOFui6sJaMCAgMFDOrhv7DRd3BTebVsKrjwJntty9Mr86UeGr+2Pqk FFIzDcO1AkEA6/aD83YRQs8PYEyef1ztdOrS66KTFpgPd/VufaeNaTJgyM8S2jxCuGavl48OJz+OJckrs4BNJ0JMhHbytn3lMwJAMLJc7+C+y9soyyTJCPqoGKizupKIokwu2Yl/lHHCz3v7zCUQMVpyUAw6RCGbpWuinXNYvWIYkBAC7f5Xg6trDQJBAK4w oWAM/NkQ+gzhAvCKrVDuOR5yOZsoTeMEb7ibBC1wXzpeg1BPxAFU7LM5i/01Ub5bL8OnJ02gB9SR6sMFVTkCQAk0W60+Yn4jaXAtvxy9gMDfAeYoVz30quCZXWitc406 QFhQPj8In5dKF4Ku92BamEyzoj5X7OtTdbYCwEpTAbg=-----END RSA PRIVATE KEY-----根据私钥生成公钥openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout同样会在bin目录下生成rsa_public_key.pem生成内容:-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDbJkpMThepmY82P4wYACp1OB8e 8zE66tGfTpfIQu5a/29O8KkQUklbVgPKh+rNZHFT6srrr0sFEpbIc0CZc75S4aXd58K9+smVcizgijzKC+y47ggfzVBhXHsaEvEcH+IMAW7VKZ4rhdydYUgP+i+XmBTyhXc9cBhR2LoAuS/mDwIDAQAB-----END PUBLIC KEY-----这时候的私钥还不能直接被使用,需要进行PKCS#8编码:openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocryp t同样会在bin目录下生成pkcs8_rsa_private_key.pem生成内容:-----BEGIN PRIVATE KEY-----MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANsmSkxOF6mZjzY/jBgAKnU4Hx7zMTrq0Z9Ol8hC7lr/b07wqRBSSVtWA8qH6s1kcVPqyuuvSwUSlshzQJlzvlLhpd3nwr36yZVyLOCKPMoL7LjuCB/NUGFcexoS8Rwf4gwBbtUpniuF3J1hSA/6L5eYFPKFdz1wGFHYugC5L+YPAgMBAAECgYAEqHax0oMcPsBVhdpDdFVysmOu87pbJzyXZ0NApXONiZpjEih1yVn30Ac6mdL61KS4BOiVQ9+TVwbPceuwl043SLTYT/jhTkNjWBUzVgl0nlbHC3LUd3numH3rKPJyYfVWXRQxEHgKZqrRtjOmea/QqzX6e8whpyXywTXtFgfGqQJBAO3CRuAMfFv2jYSizL/uoIhqlI4W6LqwlowICAwUM6uG/sNF3cFN5tWwquPAme23L0yvzpR4av7Y+qQUUjMNw7UCQQDr9oPzdhFCzw9gTJ5/XO106tLropMWmA939W59p41pMmDIzxLaPEK4Zq+Xjw4nP44lySuzgE0nQkyEdvK2 feUzAkAwslzv4L7L2yjLJMkI+qgYqLO6koiiTC7ZiX+UccLPe/vMJRAxWnJQDDpEIZula6Kdc1i9YhiQEALt/leDq2sNAkEArjChYAz82RD6DOEC8IqtUO45HnI5myhN4wRvuJsELXBfOl6DUE/EAVTsszmL/TVRvlsvw6cnTaAH1JHqwwVVOQJACTRbrT5ifiNpcC2/HL2AwN8B5ihXPfSq4JldaK1zjTpAWFA+Pwifl0oXgq73YFqYTLOiPlfs61N1tgLASlMBuA==-----END PRIVATE KEY-----至此,可用的密钥对已经生成好了,私钥使用pkcs8_rsa_private_key.pem,公钥采用rsa_public_key.pem。

补充,第一步生成的私钥文件编码是PKCS#1格式,这种格式Java其实是支持的,只不过多写两行代码而已:1.RSAPrivateKeyStructure asn1PrivKey = new RSAPrivateKeyStructure((ASN1Sequence) ASN1Sequence.fromByteArray(priKeyData));2.RSAPrivateKeySpec rsaPrivKeySpec = new RSAPrivateKeySpec(asn1PrivKey.getModulus(), asn1PrivKey.getPrivateExponent());3.KeyFactory keyFactory= KeyFactory.getInstance("RSA");4.PrivateKey priKey= keyFactory.generatePrivate(rsaPrivKeySpec);代码示例示例2 用JKD生成KEY 进行公私人钥对认证原理所谓的公钥认证,实际上是使用一对加密字符串,一个称为公钥(public key),任何人都可以看到其内容,用于加密;另一个称为密钥(private key),只有拥有者才能看到,用于解密。

通过公钥加密过的密文使用密钥可以轻松解密,但根据公钥来猜测密钥却十分困难。

ssh 的公钥认证就是使用了这一特性。

服务器和客户端都各自拥有自己的公钥和密钥。

为了说明方便,以下将使用这些符号。

Ac 客户端公钥Bc 客户端密钥As 服务器公钥Bs 服务器密钥在认证之前,客户端需要通过某种方法将公钥Ac 登录到服务器上。

认证过程分为两个步骤。

会话密钥(session key)生成客户端请求连接服务器,服务器将As 发送给客户端。

服务器生成会话ID(session id),设为p,发送给客户端。

客户端生成会话密钥(session key),设为q,并计算r = p xor q。

客户端将r 用As 进行加密,结果发送给服务器。

服务器用Bs 进行解密,获得r。

服务器进行r xor p 的运算,获得q。

至此服务器和客户端都知道了会话密钥q,以后的传输都将被q 加密。

认证服务器生成随机数x,并用Ac 加密后生成结果S(x),发送给客户端客户端使用Bc 解密S(x) 得到x客户端计算q + x 的md5 值n(q+x),q为上一步得到的会话密钥服务器计算q + x 的md5 值m(q+x)客户端将n(q+x) 发送给服务器服务器比较m(q+x) 和n(q+x),两者相同则认证成功非对称加密●服务器建立公钥:每一次启动sshd 服务时,该服务会主动去找/etc/ssh/ssh_host*的文件,若系统刚刚安装完成时,由于没有这些公钥,因此sshd 会主动去计算出这些需要的公钥,同时也会计算出服务器自己需要的私钥●客户端主动联机请求:若客户端想要联机到ssh 服务器,则需要使用适当的客户端程序来联机,包括ssh, putty 等客户端程序连接●服务器传送公钥给客户端:接收到客户端的要求后,服务器便将第一个步骤取得的公钥传送给客户端使用(此时应是明码传送,反正公钥本来就是给大家使用的)●客户端记录并比对服务器的公钥数据及随机计算自己的公私钥:若客户端第一次连接到此服务器,则会将服务器的公钥记录到客户端的用户家目录内的~/.ssh/known_hosts 。

若是已经记录过该服务器的公钥,则客户端会去比对此次接收到的与之前的记录是否有差异。

若接受此公钥,则开始计算客户端自己的公私钥●回传客户端的公钥到服务器端:用户将自己的公钥传送给服务器。

此时服务器:具有服务器的私钥与客户端的公钥,而客户端则是:具有服务器的公钥以及客户端自己的私钥,你会看到,在此次联机的服务器与客户端的密钥系统(公钥+私钥)并不一样,所以才称为非对称加密系统。

相关主题