导航:首页 > 编程语言 > python导入key公钥

python导入key公钥

发布时间:2023-06-10 18:09:17

① 怎么用 python 模拟 js 里 JSEncrypt 模块的加密方式

PC登录新浪微博时,在客户端用js预先对用户名、密码都进行了加密,而且在POST之前会GET一组参数,这也将作为POST_DATA的一部分。这样,就不能用通常的那种简单方法来模拟POST登录(比如人人网)。
通过爬虫获取新浪微博数据,模拟登录是必不可少的。
1、在提交POST请求之前,需要GET获取四个参数(servertime,nonce,pubkey和rsakv),不是之前提到的只是获取简单的servertime,nonce,这里主要是由于js对用户名、密码加密方式改变了。
1.1 由于加密方式的改变,我们这里将使用到RSA模块,有关RSA公钥加密算法的介绍可以参考网络中的有关内容。下载并安装rsa模块:
下载:https//pypi.python.org/pypi/rsa/3.1.1
rsa模块文档地址:http//stuvel.eu/files/python-rsa-doc/index.html
根据自己的Python版本选择适合自己的rsa安装包(.egg),在win下安装需要通过命令行使用easy_install.exe(win上安装setuptool从这里下载:setuptools-0.6c11.win32-py2.6.exe 安装文件 )进行安装,例如:easy_install rsa-3.1.1-py2.6.egg,最终命令行下测试import rsa,未报错则安装成功。
1.2 获得以及查看新浪微博登录js文件
查看新浪通行证url (http//login.sina.com.cn/signup/signin.php)的源代码,其中可以找到该js的地址 http//login.sina.com.cn/js/sso/ssologin.js,不过打开后里面的内容是加密过的,可以在网上找个在线解密站点解密,查看最终用户名和密码的加密方式。
1.3 登录
登录第一步,添加自己的用户名(username),请求prelogin_url链接地址:
prelogin_url = 'http//login.sina.com.cn/sso/prelogin.php?entry=sso&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&client=ssologin.js(v1.4.4)' % username
使用get方法得到以下类似内容:
sinaSSOController.preloginCallBack({"retcode":0,"servertime":1362041092,"pcid":"gz-","nonce":"IRYP4N","pubkey":"","rsakv":"1330428213","exectime":1})
进而从中提取到我们想要的servertime,nonce,pubkey和rsakv。当然,pubkey和rsakv的值我们可以写死在代码中,它们是固定值。
2、之前username 经过BASE64计算:
复制代码 代码如下:
username_ = urllib.quote(username)
username = base64.encodestring(username)[:-1]
password经过三次SHA1加密,且其中加入了 servertime 和 nonce 的值来干扰。即:两次SHA1加密后,结果加上servertime和nonce的值,再SHA1算一次。
在最新的rsa加密方法中,username还是以前一样的处理;
password加密方式和原来有所不同:
2.1 先创建一个rsa公钥,公钥的两个参数新浪微博都给了固定值,不过给的都是16进制的字符串,第一个是登录第一步中的pubkey,第二个是js加密文件中的‘10001'。
这两个值需要先从16进制转换成10进制,不过也可以写死在代码里。这里就把10001直接写死为65537。代码如下:
复制代码 代码如下:
rsaPublickey = int(pubkey, 16)
key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) #拼接明文js加密文件中得到
passwd = rsa.encrypt(message, key) #加密
passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
2.2 请求通行证url:login_url =‘http//login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.4)'
需要发送的报头信息
复制代码 代码如下:
postPara = {
'entry': 'weibo',
'gateway': '1',
'from': '',
'savestate': '7',
'userticket': '1',
'ssosimplelogin': '1',
'vsnf': '1',
'vsnval': '',
'su': encodedUserName,
'service': 'miniblog',
'servertime': serverTime,
'nonce': nonce,
'pwencode': 'rsa2',
'sp': encodedPassWord,
'encoding': 'UTF-8',
'prelt': '115',
'rsakv' : rsakv,
'url': 'http//weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'META'
}
请求的内容中添加了rsakv,将pwencode的值修改为rsa2,其他跟以前一致。
将参数组织好,POST请求。检验是否登录成功,可以参考POST后得到的内容中的一句 location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3");
如果retcode=101则表示登录失败。登录成功后结果与之类似,不过retcode的值是0。
3、登录成功后,在body中的replace信息中的url就是我们下一步要使用的url。然后对上面的url使用GET方法来向服务器发请求,保存这次请求的Cookie信息,就是我们需要的登录Cookie了。

java生成的rsa公钥 能在python上使用吗

肯定可以,这个跟语言是无关的

Python上RSA加密的库挺多的,最开始使用的是rsa,因为比较简单嘛!测试的时候也是用 python模拟App的访问,顺利通过!
然而App开发者反馈,python测试脚本没法移植到java上,因为java的加密解密模块需要更加精细的算法细节指定,否则java加密过的数据python是解不出来的。
当初就是因为rsa模块简单,不需要注重细节才选的,自己又不是专业搞加密解密的。没办法了,只能硬着头皮,捋了一遍RSA的加密原理。网上还是有比较多的讲述比较好的文章,比如RSA算法原理
原理是懂了,但具体到python和java的区别上,还是一头雾水。最终python的RSA模块换成Crypto,因为支持的参数比较多。搜了很多网站讲的都不是很详细,stackflow上有几篇还可以,借鉴了一下,最后测试通过了。还是直接上代码吧。
Java代码
//下面这行指定了RSA算法的细节,必须更python对应
private static String RSA_CONFIGURATION = "RSA/ECB/OAEPWithSHA-256AndMGF1Padding";
//这个貌似需要安装指定的provider模块,这里没有使用
private static String RSA_PROVIDER = "BC";

//解密 Key:私钥
public static String decrypt(Key key, String encryptedString){

try {
Cipher c = Cipher.getInstance(RSA_CONFIGURATION);
c.init(Cipher.DECRYPT_MODE, key, new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256,
PSource.PSpecified.DEFAULT));
byte[] decodedBytes;
decodedBytes = c.doFinal(Base64.decode(encryptedString.getBytes("UTF-8")));

return new String(decodedBytes, "UTF-8");
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Base64DecodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch ( e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//加密 Key一般是公钥
public static String encrypt(Key key, String toBeEncryptedString){

try {
Cipher c = Cipher.getInstance(RSA_CONFIGURATION);
c.init(Cipher.ENCRYPT_MODE, key, new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256,
PSource.PSpecified.DEFAULT));
byte[] encodedBytes;
encodedBytes = c.doFinal(toBeEncryptedString.getBytes("UTF-8"));

return Base64.encode(encodedBytes);
} catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch ( e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//通过Pem格式的字符串(PKCS8)生成私钥,base64是去掉头和尾的b64编码的字符串
//Pem格式私钥一般有2种规范:PKCS8和PKCS1.注意java在生成私钥时的不同
static PrivateKey generatePrivateKeyFromPKCS8(String base64)
{
byte[] privateKeyBytes;
try {
privateKeyBytes = Base64.decode(base64.getBytes("UTF-8"));
KeyFactory kf = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(privateKeyBytes);
PrivateKey privateKey = kf.generatePrivate(ks);
return privateKey;
} catch (Base64DecodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//通过Pem格式的字符串(PKCS1)生成私钥,base64是去掉头和尾的b64编码的字符串
static PrivateKey generatePrivateKeyFromPKCS1(String base64)
{
byte[] privateKeyBytes;
try {
privateKeyBytes = Base64.decode(base64.getBytes("UTF-8"));
KeyFactory kf = KeyFactory.getInstance("RSA");
X509EncodedKeySpec ks = new X509EncodedKeySpec(privateKeyBytes);
PrivateKey privateKey = kf.generatePrivate(ks);
return privateKey;
} catch (Base64DecodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//通过Pem格式的字符串(PKCS1)生成公钥,base64是去掉头和尾的b64编码的字符串
//Pem格式公钥一般采用PKCS1格式
static PublicKey generatePublicKeyFromPKCS1(String base64)
{
byte[] publicKeyBytes;
try {
publicKeyBytes = Base64.decode(base64.getBytes("UTF-8"));
KeyFactory kf = KeyFactory.getInstance("RSA");
X509EncodedKeySpec ks = new X509EncodedKeySpec(publicKeyBytes);
PublicKey publicKey = kf.generatePublic(ks);
return publicKey;
} catch (Base64DecodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//通过molus和exponent生成公钥
//参数含义就是RSA算法里的意思
public static RSAPublicKey getPublicKey(String molus, String exponent) {
try {
BigInteger b1 = new BigInteger(molus);
BigInteger b2 = new BigInteger(exponent);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);
return (RSAPublicKey) keyFactory.generatePublic(keySpec);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

Python 代码
from Config import config
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

key = RSA.generate(1024)
pubkey = key.publickey().key
def Decrypt(prikey,data):
try:
cipher = PKCS1_OAEP.new(prikey, hashAlgo=SHA256)
return cipher.decrypt(data)
except:
traceback.print_exc()
return None

def Encrypt(pubkey,data):
try:
cipher = PKCS1_OAEP.new(pubkey, hashAlgo=SHA256)
return cipher.encrypt(data)
except:
traceback.print_exc()
return None


总结
主要是对RSA算法不是很熟悉,其中很多术语不懂,导致跟java里的加密模块的函数和类对应不上。
RSA算法的细节到现在也是一知半解,但真的没时间去深入学习了。

③ python rsa模块---生成公钥和私钥的方法

https://blog.csdn.net/six66hao/article/details/81814576
https://blog.csdn.net/whatday/article/details/97617461
https://blog.csdn.net/xiongzaiabc/article/details/88400748
https://blog.csdn.net/zhao3587717/article/details/83111082/

一.
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)
对称加密算法大家共用一个密钥

数字签名: 就是为了证明该信件是确定的人发出的,而不是黑客冒充发出的
eg:
1.鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。

二.用RSA库可以生成公钥和私钥
到时候把公钥给前端,后端保存公钥和私钥

三.在用户注册/登入时,输入密码后前端会用JS对密码进行加密传送到后端
一般现在对于密码的加密解密都用RSA进行

④ “青锋爱分享”Springboot+Python之RSA加解密方案(RSA深入)二

本篇文章要结合上一节文章一起看。

青锋爱分享-RSA-Springboot+Python整合

码云搜索: 青锋 会有惊喜哦哦。

通过python生成的公钥私钥 格式PKCS1 。

生成pem格式如下:

私钥头(-----BEGIN RSA PRIVATE KEY-----)

私钥尾(-----END RSA PRIVATE KEY-----)

我需要将此私钥转换为DER编码的PKCS8未加密格式,以便与java服务器代码一起使用,特别是PKCS8EncodedKeySpec。我已经试过使用rsa和pkcs8命令的OpenSSL,如果有更简单的办法,没有特别需要使用openssl。

RSA私钥格式PKCS1和PKCS8相互转换

RSA公钥格式PKCS1和PKCS8相互转换

以下转换基于openssl命令的操作;

执行:openssl genrsa -out private.pem 1024

-----BEGIN RSA PRIVATE KEY-----

MIICXQIBAAKBgQDlLm5++/wwSfq5KfY

H8q1AO/

Uo4OMcmoSz3IAp/7//ewIDAQAB

AoGBAJkMdvF+i9Kzc6YqMC0rfQJ3Zs+vFOtsbmQVAMnQ8JWBCJ1O8d/c60wRQgyb

lFCyO7VXOmoIJqX/Jr2aER8bFtG+

lOdOay7TkE45X/Wc7K9iZs2uuB7sylIvK/HVxxit6FGePa4RAkEA9e+VoAbxBv78

HyxRcStW+

n0UxgT55MPXWGdMRXUUOCNnMilaw/

HvK0IW3zpOgf/+/W565ROI/fjkR1qCD

rZJeHgqMWDlIUuR9+BdBAkAI8+

puQxMonRWTN+

-----END RSA PRIVATE KEY-----


执行:openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out pkcs8.pem


-----BEGIN PRIVATE KEY-----

+n

yHOOfV+XbBPsC7aWblIS3Pqv7/DBJ+/T

uaDSVA4K8Tmx22YC8PZ7HfAJ5/yVaaB2HmpSjg4xyahLPcgCn/v8WcxqDUh6VJ92

/

Q3fic/

+

nt0qVQJAOmMZ67caK+YHZ0M3Rp3adQgF+

//6OHlRQIElgect4wb

CbtfXWu9AfXNbTlXH39bnrlE4j9+

Yt1Zx5df0+

HLU0VEwSQa7rvmY=

-----END PRIVATE KEY-----


执行:openssl rsa -in pkcs8.pem -out pkcs1.pem


-----BEGIN RSA PRIVATE KEY-----

MIICXQIBAAKBgQDlLm5++/wwSfq5KfY

H8q1AO/

Uo4OMcmoSz3IAp/7//ewIDAQAB

AoGBAJkMdvF+i9Kzc6YqMC0rfQJ3Zs+vFOtsbmQVAMnQ8JWBCJ1O8d/c60wRQgyb

lFCyO7VXOmoIJqX/Jr2aER8bFtG+

lOdOay7TkE45X/Wc7K9iZs2uuB7sylIvK/HVxxit6FGePa4RAkEA9e+VoAbxBv78

HyxRcStW+

n0UxgT55MPXWGdMRXUUOCNnMilaw/

HvK0IW3zpOgf/+/W565ROI/fjkR1qCD

rZJeHgqMWDlIUuR9+BdBAkAI8+

puQxMonRWTN+

-----END RSA PRIVATE KEY-----


可以看出结果和1是一致的;

执行:openssl rsa -in private.pem -pubout -out public.pem


-----BEGIN PUBLIC KEY-----

+Kosybacfp8hzjn1fl2wT

7Au2lm5SEtz6r+/wwSfq5KfYH8q1AO/

/7/FnMag1IelSfdronPBDxazp6

NUmQZITsYK6CsEl/ewIDAQAB

-----END PUBLIC KEY-----


5. 从pkcs8私钥中生成pkcs8公钥
执行:openssl rsa -in pkcs8.pem -pubout -out public_pkcs8.pem


-----BEGIN PUBLIC KEY-----

+Kosybacfp8hzjn1fl2wT

7Au2lm5SEtz6r+/wwSfq5KfYH8q1AO/

/7/FnMag1IelSfdronPBDxazp6

NUmQZITsYK6CsEl/ewIDAQAB

-----END PUBLIC KEY-----


可以看出结果和4是一样的;

执行:openssl rsa -pubin -in public.pem -RSAPublicKey_out


-----BEGIN RSA PUBLIC KEY-----

MIGJAoGBAOUubn4qizJtpx+nyHOOfV+XbBPsC7aWblIS3Pqv7/DBJ+rkp9gfyrUA

78L3YjASmmU1uupiY5dC7o/TuaDSVA4K8Tmx22YC8PZ7HfAJ5/yVaaB2HmpSjg4x

yahLPcgCn/=

-----END RSA PUBLIC KEY-----



openssl rsa -pubin -in public_pkcs8.pem -RSAPublicKey_out


-----BEGIN RSA PUBLIC KEY-----

MIGJAoGBAOUubn4qizJtpx+nyHOOfV+XbBPsC7aWblIS3Pqv7/DBJ+rkp9gfyrUA

78L3YjASmmU1uupiY5dC7o/TuaDSVA4K8Tmx22YC8PZ7HfAJ5/yVaaB2HmpSjg4x

yahLPcgCn/=

-----END RSA PUBLIC KEY-----


可以看出转换的结果是一致的;

执行:openssl rsa -RSAPublicKey_in -in pub_pkcs1.pem -pubout


-----BEGIN PUBLIC KEY-----

+Kosybacfp8hzjn1fl2wT

7Au2lm5SEtz6r+/wwSfq5KfYH8q1AO/

/7/FnMag1IelSfdronPBDxazp6

NUmQZITsYK6CsEl/ewIDAQAB

-----END PUBLIC KEY-----


可以看到和上面4,5的结果是一致的;

最后一点:
iOS上用的是pkcs8格式的公钥
openssl用的是pkcs1格式的公钥
知道私钥以后是可以导出公钥的,所以私钥一定要保证安全
知道公钥不可以导出私钥


解决方案针对是window电脑。

配置:SystemRoot/ System32 环境变量。

1、邮件我的电脑-选择下【属性】。

2、选择高级系统设置

3、选择【高级】-【环境变量】

4、双击打开path,进行编辑

5、 接着我们在这名字后面加【;System32】就可以了。

安装 Win64 OpenSSL,地址: http://slproweb.com/procts/Win32OpenSSL.html

下载后根据提示一步一步安装,安装完成后:

双击start.bat 启动

⑤ 一直不明白python字典的key是怎么回事

python字典其实就是python的键值对集合。键也就是key,相当于一个标签,举个通俗易懂的例子,字典相当于顺风快递的仓库,每一个键值对相当于一个包裹,key就是包裹上的地址,可以让你方便地找到包裹,值即value,就是包裹里面的东西。
希望可以帮助你

阅读全文

与python导入key公钥相关的资料

热点内容
id加密门禁卡可以复制到手机吗 浏览:672
路由器如何控制某个app 浏览:43
C51编译器在标准C的基础上 浏览:260
银行卡掉了可以办车贷解压吗 浏览:317
没解压可以贷款吗 浏览:517
最小pdf阅读器 浏览:808
游戏被加密了怎样用电脑打开 浏览:300
蓝灯如何手动选择服务器 浏览:85
服务器设置在中国意味什么 浏览:571
单片机不能进行选择控制 浏览:694
咕咚手表如何绑定手机app 浏览:530
命令虚拟语气 浏览:405
戴尔系统命令 浏览:583
怎样压缩视频文件大小 浏览:686
51单片机信号发生器 浏览:56
米拍摄影哪个app好 浏览:88
天津致远曙光服务器云服务器 浏览:117
光子程序员怎么获得 浏览:535
中医诊断学第九版pdf 浏览:498
python集成包 浏览:305