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替换相应文件即可,这样秘钥就没有长度限制了。至此,如果还有报错什么的,那估计就是代码问题了。
先了解一下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替换相应文件即可,这样秘钥就没有长度限制了。至此,如果还有报错什么的,那估计就是代码问题了。
相关文章推荐
- 使用openssl实现rsa非对称加密算法示例
- 非对称加密算法RSA使用注意事项
- 【编程开发】非对称加密过程详解(基于RSA非对称加密算法实现)
- 【加密与解密】Openssl 生成的RSA秘钥如被C#使用解密
- 非对称加密过程详解(基于RSA非对称加密算法实现)
- openssl 非对称加密算法RSA命令详解
- openssl 非对称加密算法RSA命令详解
- php使用openssl来实现RSA(非对称加密)
- RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密
- openssl 非对称加密DSA,RSA区别与使用介绍(转)
- 非对称加密RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。使用最广泛的是RSA算法
- 【RSA】openssl 非对称加密算法RSA命令详解
- openssl 的RSA 非对称加密算法
- openssl 非对称加密算法RSA命令详解
- openssl 非对称加密DSA,RSA区别与使用介绍
- 使用openssl RSA非对称加密示例
- openssl RSA DSA 加密算法使用
- 非对称加密过程详解(基于RSA非对称加密算法实现)
- php使用openssl来实现RSA(非对称加密)
- 加密算法使用(五):RSA使用全过程