java和python的SHA-1形式RSA加密方式代码互通

来源:互联网 发布:凌慕枫叶知秋全文免费 编辑:程序博客网 时间:2024/05/19 03:43
说明: 由于只知道n和d两个参数,找了许久才找到对应的python方法来生成pem格式密钥对以及对字符串进行SHA-1方式加密签名

一、生成密钥对


1.openssl生成PKCS#1格式

openssl genrsa -out rsa_private_key.pem 1024
openssl 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
原创粉丝点击