您的位置:首页 > 运维架构

RSA非对称加密算法及使用openssl创建秘钥过程

2017-04-30 13:08 162 查看
       最近工作中用到了RSA加密,以前图省事都是用MD5加密,但这次涉及到资金实时付款相关业务,所以用到了RSA加密。“RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和Len Adleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥”。虽然相关资料很早就看过,但始终没有写过相关业务代码,这次做这个功能,还是踩了几个小坑,现在简单整理一下。
       先了解一下RSA加密的基本常识。RSA加密属于非对称加密,加密一个秘钥,解密一个秘钥,分别为公钥和私钥。所谓公钥,就是公开的秘钥,任何人都可以下载、浏览、使用,而私钥,是一旦创建后,只有自己知道的秘钥,一定不能泄露给他人,否则整个加密过程就没有任何意义。RSA算法一般有两种使用场景,分别是加密和签名。
       加密过程,即使用公钥加密、私钥解密过程。公钥加密:明文加公钥,输出密文;私钥解密:密文加私钥,输出明文。这个过程,是要确保传输的信息没有被别人看过。比如Alice想把一段明文通过RSA加密算法发送给Bob,虽然Bob的公钥已经公开,包括Alice在内很多人都知道,但是Alice使用Bob的公钥加密后,发送给Bob,因为全世界只有Bob才有私钥,所以这段密文就算被其他人截获,但是他们没有私钥,所以也就无法解密这段密文。
       数字签名,刚好和加密相反,即使用私钥加密,公钥解密过程。这个过程,是要确保传输的信息没有被别人篡改过。比如Alice想把一段明文通过RSA加密算法发送给Bob,这段明文Alice并不怕别人看到,但是怕被别人篡改。于是Alice选择使用自己的私钥加密这段明文,然后发送给Bob。当然,Alice的公钥像Bob的公钥一样,很多人都知道,Bob也知道,于是Bob收到这段密文后,使用Alice的公钥解密,如果解密成功,那么就可以证明这段信息确实来自Alice,并且没有被篡改过。
       一段明文如果即加密又做签名,安全保障将得到极大提升。当然,计算也更耗时。下面是linux环境下使用openssl工具创建RSA公钥和私钥的一些细节。

       1. 如果没有安装openssl,需要在终端输入sudo apt-get install openssl进行安装。
       2. 创建一个临时文件夹rsa,然后cd进入。
       3. 使用如下命令生成私钥:
       openssl genrsa -out rsa_private_key.pem 1024
       参数: genrsa 生成密钥   -out 输出到文件  rsa_private_key.pem 文件名  1024 长度
       4. 将私钥转成pkcs8格式。如果不做转换,直接使用生成的私钥,java环境下,将报java.security.InvalidKeyException: IOException : algid parse error, not a sequence错误。转换命令为:
       openssl pkcs8 -topk8 -nocrypt -inform PEM -in rsa_private_key.pem -outform PEM outform
       当时看相关资料时,发现很多博客上提到使用如下转换命令:
       openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt
       我在实际使用时,发现这样转换不对,报如下错误:java.security.InvalidKeyException: IOException : DER input, Integer tag error,可能环境不一样吧。
       5. 从私钥中提取公钥:
       openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem,
       参数: rsa 提取公钥  -in 从文件中读入  rsa_private_key.pem 文件名   -pubout  输出   -out 到文件  rsa_public_key.pem  文件名
       输入完命令后,生成的公钥及私钥如下:
                 


       当然,如果此时将公钥、私钥集成进程序后,运行程序发现还是报错:java.security.InvalidKeyException:
Illegal key size or default parameters,不过解决方法很简单。如果是java1.8的话,可以直接到如下链接下载文件:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
       然后分别进入jdk及jre中的lib目录中的secrity文件夹,使用新下载的local_policy.jar及US_export_policy.jar替换相应文件即可,这样秘钥就没有长度限制了。至此,如果还有报错什么的,那估计就是代码问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: