java和python的SHA-1形式RSA加密方式代码互通
来源:互联网 发布:凌慕枫叶知秋全文免费 编辑:程序博客网 时间:2024/05/19 03:43
说明: 由于只知道n和d两个参数,找了许久才找到对应的python方法来生成pem格式密钥对以及对字符串进行SHA-1方式加密签名
一、生成密钥对
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
2.openssl生成PKCS#8格式
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
转换后显示如下
二、RSA加密签名代码(仅用到n、d参数签名加密,未涉及签名验证)
三、python相关RSA加密库
技术文档: https://stuvel.eu/files/python-rsa-doc/usage.html
技术文档: http://pythonhosted.org/pycrypto/
有利理解以上代码的文章:
java对应: http://blog.csdn.net/centralperk/article/details/8558678
python对应: http://blog.itpub.net/26250550/viewspace-1284723/
作者测试环境说明:
系统: ubuntu 14.04 LTS
rsa版本: 3.3
python版本: 3.4.3
java版本: 6
一、生成密钥对
1.openssl生成PKCS#1格式
openssl genrsa -out rsa_private_key.pem 1024openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
格式如下
rsa_private_key.pem文件-----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQDMjj62EXnlJX6jraozKaSfGsF3b41SCBwBIIsecMglHpGeIXzDHaX0+u4rh/pBKbnyaoEnxWU0W4oHg1bVnTWUICr8npehMajZqUGW8Pizl9X/HJiyoqEvyoaWQJJZUHz4QRk77X5pRpkJsQYaC9L7Qq5Dvu+GALExKi422RJ/lQIDAQABAoGADtdnP2iHMpQE2zVXevzTf+O+E79ZPpFuDrrgvSWrr93G7PU7CyEUkHDAZRIpmx6+6hLGKi+NRz45BpCF9VvBrktpBY3e5dluTuX9kKn0K3uPxOawltCKVajmQwkSlL1oDl0t2P9ZnxeiiDzPY/5ptHRGfFOd5nCWCcm8TNNsgSECQQDtBcSpo+Dk+LW84mTuuE/Nxl4J54X6KUr9F0DjrojYlDAwBh33/Es++rpz0Py3LeSY+o/TzJTtOB14R+ju3/XtAkEA3O8BbLeu1pzZO92gL/gP0P4bXk7kj9s21s6TlObycN4UgQvkqifOmtT2R7nWAXs1rLhatAxF2Ed40KLsNq77SQJBAOD6q6yWOD8+8Eqk3kdVvbJFyzc9gwdsMJjBfL9hCNYC+yZqeAHOgaH7HgYW5fn93tFybBkPRIFS1W45W5l6DhUCQFKbKrUzmLO1waOYoiRNY9yIpkMEzIDdPgvjAVtTXqLE5nW5tK3KZH2P0uXOni2/m7oQ1Bkt3Y+YaZvYzulDU8ECQQCHwwRUshtX0u27DDLPk2VbB+mvVR7Y2sOOu/M+AEiCCGoiG7txUpSUv3QOd4AwNHtG6QSDYB9Im25WA/CQJBws-----END RSA PRIVATE KEY-----rsa_public_key.pem文件
-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMjj62EXnlJX6jraozKaSfGsF3b41SCBwBIIsecMglHpGeIXzDHaX0+u4rh/pBKbnyaoEnxWU0W4oHg1bVnTWUICr8npehMajZqUGW8Pizl9X/HJiyoqEvyoaWQJJZUHz4QRk77X5pRpkJsQYaC9L7Qq5Dvu+GALExKi422RJ/lQIDAQAB-----END PUBLIC KEY-----
2.openssl生成PKCS#8格式
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
转换后显示如下
-----BEGIN PRIVATE KEY-----MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMyOPrYReeUlfqOtqjMppJ8awXdvjVIIHAEgix5wyCUekZ4hfMMdpfT67iuH+kEpufJqgSfFZTRbigeDVtWdNZQgKvyel6ExqNmpQZbw+LOX1f8cmLKioS/KhpZAkllQfPhBGTvtfmlGmQmxBhoL0vtCrkO+74YAsTEqLjbZEn+VAgMBAAECgYAO12c/aIcylATbNVd6/NN/474Tv1k+kW4OuuC9Jauv3cbs9TsLIRSQcMBlEimbHr7qEsYqL41HPjkGkIX1W8GuS2kFjd7l2W5O5f2QqfQre4/E5rCW0IpVqOZDCRKUvWgOXS3Y/1mfF6KIPM9j/mm0dEZ8U53mcJYJybxM02yBIQJBAO0FxKmj4OT4tbziZO64T83GXgnnhfopSv0XQOOuiNiUMDAGHff8Sz76unPQ/Lct5Jj6j9PMlO04HXhH6O7f9e0CQQDc7wFst67WnNk73aAv+A/Q/hteTuSP2zbWzpOU5vJw3hSBC+SqJ86a1PZHudYBezWsuFq0DEXYR3jQouw2rvtJAkEA4PqrrJY4Pz7wSqTeR1W9skXLNz2DB2wwmMF8v2EI1gL7Jmp4Ac6BofseBhbl+f3e0XJsGQ9EgVLVbjlbmXoOFQJAUpsqtTOYs7XBo5iiJE1j3IimQwTMgN0+C+MBW1NeosTmdbm0rcpkfY/S5c6eLb+buhDUGS3dj5hpm9jO6UNTwQJBAIfDBFSyG1fS7bsMMs+TZVsH6a9VHtjaw4678z4ASIIIaiIbu3FSlJS/dA53gDA0e0bpBINgH0ibblYD8JAkHCw=-----END PRIVATE KEY-----3.python方式生成PKCS#1格式
import rsa(pubkey, privkey) = rsa.newkeys(1024)privkey.save_pkcs1('PEM')pubkey.save_pkcs1('PEM')
二、RSA加密签名代码(仅用到n、d参数签名加密,未涉及签名验证)
java代码
import java.math.BigInteger;import java.security.KeyFactory;import java.security.PrivateKey;import java.security.Signature;import java.security.spec.RSAPrivateKeySpec;import sun.misc.BASE64Encoder;private static final String signKeyModHex ="cc8e3eb61179e5257ea3adaa3329a49f1ac1776f8d52081c01208b1e70c8251e919e217cc31da5f4faee2b87fa4129b9f26a8127c565345b8a078356d59d3594202afc9e97a131a8d9a94196f0f8b397d5ff1c98b2a2a12fca8696409259507cf841193bed7e69469909b1061a0bd2fb42ae43beef8600b1312a2e36d9127f95"private static final String signKeyExpHex ="ed7673f6887329404db35577afcd37fe3be13bf593e916e0ebae0bd25abafddc6ecf53b0b21149070c06512299b1ebeea12c62a2f8d473e39069085f55bc1ae4b69058ddee5d96e4ee5fd90a9f42b7b8fc4e6b096d08a55a8e643091294bd680e5d2dd8ff599f17a2883ccf63fe69b474467c539de6709609c9bc4cd36c8121"sign_str = "123456"public static String sign(String data) { try { Signature signature = initSignKey(); signature.update(data.getBytes("UTF-8")); byte[] sign = signature.sign(); return BASE64Encoder.encode(sign); } catch (Exception e) { e.printStackTrace(); return ""; }}private static Signature initSignKey() throws Exception { BigInteger mod = new BigInteger(signKeyModHex, 16); BigInteger exp = new BigInteger(signKeyExpHex, 16); RSAPrivateKeySpec spec = new RSAPrivateKeySpec(mod, exp); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey signKey = keyFactory.generatePrivate(spec); Signature signature = Signature.getInstance("SHA1withRSA"); signature.initSign(signKey); return signature;}sign(sign_str)=====显示结果如下=====ZheD47i084OYcQaO1OWG/7m7SEZ3ipuS8Qi9asqsvNtEphDxA3LahhrB6jZEQI7mvkMwgxrU+ab6Q8bGUYoDZxs8z4MfyQNfd8S0Sg6kqbquc3p2p4DwSX2mgGjCxZw3dF1fBUFi58o/7foux74g/heiOzCm4zviEv1iaRBrCms=python代码
import base64 import hashlibimport rsafrom Crypto.PublicKey import RSAsignKeyModHex = "cc8e3eb61179e5257ea3adaa3329a49f1ac1776f8d52081c01208b1e70c8251e919e217cc31da5f4faee2b87fa4129b9f26a8127c565345b8a078356d59d3594202afc9e97a131a8d9a94196f0f8b397d5ff1c98b2a2a12fca8696409259507cf841193bed7e69469909b1061a0bd2fb42ae43beef8600b1312a2e36d9127f95"signKeyExpHex = "ed7673f6887329404db35577afcd37fe3be13bf593e916e0ebae0bd25abafddc6ecf53b0b21149070c06512299b1ebeea12c62a2f8d473e39069085f55bc1ae4b69058ddee5d96e4ee5fd90a9f42b7b8fc4e6b096d08a55a8e643091294bd680e5d2dd8ff599f17a2883ccf63fe69b474467c539de6709609c9bc4cd36c8121"n = int(signKeyModHex,16)d = int(signKeyExpHex,16)sign_str = "123456"# 方法一:# 说明:# rsa.key.PrivateKey原型: def __init__(self, n, e, d, p, q, exp1=None, exp2=None, coef=None):# 当coef参数为空时, p、q不能为0; coef参数为1时, p、q可为0。因为仅仅只有n、d参数已知。privatekey = rsa.key.PrivateKey(n,0,d,0,0,coef=1)# 方法二:impl = RSA.RSAImplementation(use_fast_math=False)privatekey = impl.construct((n, 0))privatekey.key.d = d# 方法三(使用PKCS#1格式导入):with open('rsa_private_key.pem', 'rb') as privatefile: keydata = privatefile.read()privatekey = rsa.PrivateKey.load_pkcs1(keydata)# 对字符串加密签名signature = rsa.sign(sign_str.encode('utf-8'), privatekey, 'SHA-1')signature_base64 = base64.b64encode(signature).decode('utf-8') print(signature)print(signature_base64)=====显示结果如下=====b'f\x17\x83\xe3\xb8\xb4\xf3\x83\x98q\x06\x8e\xd4\xe5\x86\xff\xb9\xbbHFw\x8a\x9b\x92\xf1\x08\xbdj\xca\xac\xbc\xdbD\xa6\x10\xf1\x03r\xda\x86\x1a\xc1\xea6D@\x8e\xe6\xbeC0\x83\x1a\xd4\xf9\xa6\xfaC\xc6\xc6Q\x8a\x03g\x1b<\xcf\x83\x1f\xc9\x03_w\xc4\xb4J\x0e\xa4\xa9\xba\xaeszv\xa7\x80\xf0I}\xa6\x80h\xc2\xc5\x9c7t]_\x05Ab\xe7\xca?\xed\xfa.\xc7\xbe \xfe\x17\xa2;0\xa6\xe3;\xe2\x12\xfdbi\x10k\nk''ZheD47i084OYcQaO1OWG/7m7SEZ3ipuS8Qi9asqsvNtEphDxA3LahhrB6jZEQI7mvkMwgxrU+ab6Q8bGUYoDZxs8z4MfyQNfd8S0Sg6kqbquc3p2p4DwSX2mgGjCxZw3dF1fBUFi58o/7foux74g/heiOzCm4zviEv1iaRBrCms='
三、python相关RSA加密库
1.rsa
安装: pip install rsa技术文档: https://stuvel.eu/files/python-rsa-doc/usage.html
2.Crypto
安装: pip install pycrypto技术文档: http://pythonhosted.org/pycrypto/
3.M2Crypto
技术文档: http://www.heikkitoivonen.net/m2crypto/api/有利理解以上代码的文章:
java对应: http://blog.csdn.net/centralperk/article/details/8558678
python对应: http://blog.itpub.net/26250550/viewspace-1284723/
作者测试环境说明:
系统: ubuntu 14.04 LTS
rsa版本: 3.3
python版本: 3.4.3
java版本: 6
1 0
- java和python的SHA-1形式RSA加密方式代码互通
- php 和 java RSA 对称加密互通的问题
- Java和.net加密解密互通RSA
- java和php实现RSA加密互通
- php和java之间rsa加密互通
- Android平台和java平台 DES、3DES、RSA加密解密互通程序及其不能互通的原因
- .NET和java的RSA互通,仅此而已
- NET和java的RSA互通,仅此而已
- AES+RSA加密解密(js和java互通)
- Python 和 java的 RSA加密解密
- 【代码】Android和java平台 DES加密解密互通程序及其不能互通的原因
- C# RSA和Java RSA互通
- Android 与 .net 互通的RSA加密
- Android 与 .net 互通的RSA加密
- DES、RSA、RSA数字签名、MD5、SHA 加密解密代码
- Java实现SHA-256加密的两种方式
- Java/Android GZip,BZip2,Zip 压缩封装 和 MD5,RSA,SHA,Desede 加密封装
- 【小代码】SHA-1加密
- 莫队学习总结(一) :清橙A1206.小Z的袜子 && CF 86D
- 非常好的Java反射例子
- 打印三角形
- 【SDOI2014】数数
- 接口和抽象类有什么区别
- java和python的SHA-1形式RSA加密方式代码互通
- Android Studio 更新升级方法
- 21-修改表给mysql添加外键
- silverlight---------------------------
- charter 2-java对象和类
- JSP的内置对象及其用法
- MediaSession框架介绍
- 广告拍卖机制与点击率预估概述(二)
- Lintcode : 统计比给定整数小的数的个数