python之js解密_python中的RSA加密和JS中的解密
我是密码学的全新人物.我想从服务器端生成RSA密钥对,并将其发送给所有客户端(浏览器).但在此之前,我只是通过加密python中的数据并通过pubnub发送到index.html文件并尝试在JavaScript中解密来测试场景.问题是当我做加密时;
random_generator = Random.new().read
key = RSA.generate(1024, random_generator)
print key.exportKey() #
public_key = key.publickey()
print public_key.exportKey() #
msg = "hello"
enc_data = public_key.encrypt(msg, 32)
print '----ENCRYPTED DATA----'
enc = enc_data[0]
并发送加密数据enc,它给我这个错误:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc4 in position 2: invalid continuation byte
我试着把它转换成
enc = base64.b64encode(enc_data[0])
它发送没有错误.但JS解密方法获取无
var enc_from_python = $('#input').val();
console.log("ENCRYPTED data:", enc_from_python);
var decrypt = new JSEncrypt();
decrypt.setPrivateKey($('#privkey').val());
var uncrypted = decrypt.decrypt(enc_from_python);
console.log(">>>",uncrypted); //
这两个代码都可以自己进行加/减.我还尝试使用python中收到的密钥对来加密/解析JS中的数据,这很有效.我想问题是来自Pycrypto的编码数据的unicode编码格式不匹配.谁能告诉我在这里我错过了什么.
Python的完整代码:
import time
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub
from Crypto.PublicKey import RSA
from Crypto import Random
import base64
pnconfig = PNConfiguration()
pnconfig.subscribe_key = 'demo'
pnconfig.publish_key = 'demo'
channel = "my_channel"
pubnub = PubNub(pnconfig)
def my_publish_callback(envelope, status):
if not status.is_error():
pass # Message successfully published to specified channel.
else:
pass # Handle message publish error. Check 'category' property to find out possible issue
time.sleep(1)
random_generator = Random.new().read
key = RSA.generate(1024, random_generator)
print key.exportKey() #
public_key = key.publickey()
print public_key.exportKey() #
msg = "hello"
enc_data = public_key.encrypt(msg, 32)
print '----ENCRYPTED DATA----'
#enc = enc_data[0]
enc = base64.b64encode(enc_data[0])
print enc
#print type(enc_data[0])
print '----ENCRYPTED DATA----'
print ''
print '----DECRYPTED DATA begin----'
print key.decrypt(enc_data[0])
print '----DECRYPTED DATA end----'
pubnub.publish().channel(channel).message({"data": enc , "private": (key.exportKey()), "public" : (public_key.exportKey())}).async(my_publish_callback)
和完整的JS代码是;
JavaScript RSA Encryption
// Call this code when the page is done loading.
$(function() {
pubnub = new PubNub({
publish_key: 'demo',
subscribe_key: 'demo'
});
pubnub.subscribe({
channels: ['my_channel']
});
pubnub.addListener({
message: function(message) {
var msg = message.message;
console.log("msg:" + JSON.stringify(msg));
if (msg.private){
$("#privkey").val(msg.private);
}
if(msg.public){
$("#pubkey").val(msg.public);
}
if(msg.data){
$("#input").val(msg.data);
}
}
})
// Run a quick encryption/decryption when they click.
$('#testme').click(function() {
var enc_from_python = $('#input').val();
console.log("ENCRYPTED data:", enc_from_python);
// Decrypt with the private key...
var decrypt = new JSEncrypt();
decrypt.setPrivateKey($('#privkey').val());
var uncrypted = decrypt.decrypt(enc_from_python);
console.log(">>>",uncrypted); //
// Now a simple check to see if the round-trip worked.
if (uncrypted == $('#input').val()) {
alert('It works!!!');
}
else {
alert('Something went wrong....');
}
});
});
Private Key
Public Key
Text to decrypt:
This is a test!
解决方法:
如果您使用Crypto.Cipher.PKCS1_v1_5则可以.
这是python代码.
我只测试了python 3,但我相信它应该在python 2中使用__future__导入.
from __future__ import unicode_literals, print_function # python2
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
private_key = """-----BEGIN RSA PRIVATE KEY-----
MIIBOwIBAAJBANBOMQo9wX55+w1ijEaPoYRP2T4BOjoFv3ma0QWqYYQ8FH0z14Zc
B/jb0j2PWpyNcsUUBovj+yWxQnQohCck64kCAwEAAQJBAL4s9PbNpO9MfFkfBMSS
8zoyEDtcsYUxpDtojbandDpdXfvn5D279QaOVLb1C3DgQTTEmroYB8dbeZBc5YJC
2AECIQDqyUn68ehRcx/EyLMUB1IuckZBWCIApgfn7phgVwSwiQIhAOMgY4bN+xrx
UV15Ian4ZbkME1IbAvDPcWuNGHxdsaMBAiBoz0K/S44yDfp4lj+bCUmeglTqhrVn
JLcSymgrWa02QQIhAMJFvPvcilGkYl1atCHHt3LN0mTjd+N0/OXq3SvblIsBAiAc
8RzaV1GmjMEJxw9vM/tQwQg0kyAPlITMRXnwGA6E0A==
-----END RSA PRIVATE KEY-----"""
rsa = RSA.importKey(private_key)
cipher = PKCS1_v1_5.new(rsa)
def encrypt(msg):
ciphertext = cipher.encrypt(msg.encode('utf8'))
return base64.b64encode(ciphertext).decode('ascii')
def decrypt(msg):
ciphertext = base64.b64decode(msg.encode('ascii'))
plaintext = cipher.decrypt(ciphertext, b'DECRYPTION FAILED')
return plaintext.decode('utf8')
ciphertext = encrypt('hello stackoverflow!')
print(ciphertext)
plaintext = decrypt(ciphertext)
print(plaintext)
从明文“hello stackoverflow!”输出样本密文:
tZDRXXcf7ppbVr9JBHQ3+2k3geofl8BdDmLT3HRoqBGvfknY+xISbvy5hYH2alPAUDu2ae4iSYsLyRFBOnzpgw==
在javascript中,原始代码应该有效.这是一个简化版本,用于演示此特定密文和私有rsa密钥的工作原理.
const decrypt = () => {
const privateKey = document.getElementById('private_key').value
const cipherText = document.getElementById('ciphertext').value
const decrypt = new JSEncrypt()
decrypt.setPrivateKey(privateKey)
const plainText = decrypt.decrypt(cipherText) || 'DECRYPTION FAILED'
document.getElementById('plaintext').innerHTML = plainText
}
document.querySelector('button').addEventListener('click', decrypt)
Decrypt
plaintext:
ciphertext:
tZDRXXcf7ppbVr9JBHQ3+2k3geofl8BdDmLT3HRoqBGvfknY+xISbvy5hYH2alPAUDu2ae4iSYsLyRFBOnzpgw==
private key:
-----BEGIN RSA PRIVATE KEY-----
MIIBOwIBAAJBANBOMQo9wX55+w1ijEaPoYRP2T4BOjoFv3ma0QWqYYQ8FH0z14Zc
B/jb0j2PWpyNcsUUBovj+yWxQnQohCck64kCAwEAAQJBAL4s9PbNpO9MfFkfBMSS
8zoyEDtcsYUxpDtojbandDpdXfvn5D279QaOVLb1C3DgQTTEmroYB8dbeZBc5YJC
2AECIQDqyUn68ehRcx/EyLMUB1IuckZBWCIApgfn7phgVwSwiQIhAOMgY4bN+xrx
UV15Ian4ZbkME1IbAvDPcWuNGHxdsaMBAiBoz0K/S44yDfp4lj+bCUmeglTqhrVn
JLcSymgrWa02QQIhAMJFvPvcilGkYl1atCHHt3LN0mTjd+N0/OXq3SvblIsBAiAc
8RzaV1GmjMEJxw9vM/tQwQg0kyAPlITMRXnwGA6E0A==
-----END RSA PRIVATE KEY-----
标签:pycrypto,python,encryption,rsa,jsencrypt
来源: https://codeday.me/bug/20190823/1699828.html
python之js解密_python中的RSA加密和JS中的解密相关推荐
- javascript 解密_Javascript中的AES加密和Java中的解密
javascript 解密 AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本,例如密码,然后将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加 ...
- Javascript中的AES加密和Java中的解密
AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本(例如密码)并将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加容易在相同的平台(例如Andr ...
- 在ASP.Net中实现RSA加密
在我们实际运用中,加密是保证数据安全的重要手段.以前使用ASP时,对数据加密可以使用MD5和SHA1算法,这两种算法虽然快捷有效,但是无法对通过它们加密的密文进行反运算,即是解密.因此需要解密数据的场 ...
- python获取mysql中的数据供js调用_python 读取mysql数据至csv文件中,并发送邮件
test 代码: #coding:utf-8 ''' Created on 2019年2月18日 @author: Administrator ''' import ConfigParser impo ...
- 在ASP中实现RsA加密与解密
本文章有两文件组成 test.asp 测试演示文件 clsrsa.asp 实现rsa加密与解密的vbs类文件 下面是代码: 1. test.asp <% rem 文章标题:在asp中通过vbs类 ...
- javascript中使用RSA加密解密
RSA加密解密 问题1:公钥和私钥是哪里来的: 问题2:如果是后端加密,前端解密 代码 问题1:公钥和私钥是哪里来的: https://www.bejson.com/enc/rsa/ 去官网生成唯一的 ...
- python代码变量作业_python - 是否可以在Jenkins的代码中注入变量,然后像往常一样运行作业? - SO中文参考 - www.soinside.com...
我想使用Jenkins在多个平台浏览器配置上运行多个自动化作业.用python编写的自动化框架已经设置为使用Saucelabs实现此目的. 编写代码的人将其拆分为每个浏览器的单独文件夹,每个文件夹都有 ...
- python中使用rsa加密
前提不多说, 为什么使用RSA加密请自行搜索,直接正为: 一. 生成公钥及私钥, 并保存 二. 使用公钥加密, 私钥解密 后记: 通常使用中, 会先对数据进行bas64加密, 再对加密后的内容使用rs ...
- python rsa加密二进制文件_用Python中的RSA加密文件
公钥密码通常只用于少量数据.它很慢,很难正确使用.通常的做法是使用其他方法将非对称问题减少到由共享密钥提供安全性的问题,然后使用公钥加密来保护该共享密钥.例如:要加密文件,随机生成块或流密码(例如AE ...
最新文章
- 用指针查找数组中温度值为32的天数
- nginx fastcgi python_linux下nginx+python+fastcgi部署总结(django版)
- tolua++ 手册翻译地址
- iOS OC语言: Block底层实现原理
- 打桩时不修改源码_考研网上报名点了修改报名,修改后到报名点时,出现部分信息不符合参考条件,请修改或重新报名...
- struts2在Action中访问Session,管理员删除用户
- [OI学习笔记]最小生成树之Prim算法
- 深入理解 GraphQL
- Reeder 5 for Mac(RSS阅读器)
- 键盘常用ASCII码对照表
- 实战PHP皮皮虾去水印解析接口
- 各种音视频编解码学习详解(7)--微软Windows Media系列
- Android系统应用开发
- iOS TextField收取键盘的方法
- 深度学习中框架中reshape和transpose的区别
- Mac使用Python接入东方财富量化接口Choice,调试与获取数据
- 苹果5G芯片研发失败:继续依赖高通,还要担心被起诉?
- 斗罗大陆CSS_204687
- Finalshell反复提示输入密码
- 大数据技术在电商的应用
热门文章
- window.frames在不同浏览器中的用法
- 备战原创博主大赛,如何写出一篇属于自己的好文章?
- Ubuntu 20.04 下载 wine HQ
- Unity 游戏入门 四、 游戏地图的创建World Design – Tilemaps
- 【C++】深入理解“内联与宏”
- java 入门 博客园_java入门基础
- 2019IDEA加载了但新建中无法找到VUE组件的问题
- 家庭记账小账本(一)
- android manager provider模式,安卓情景模式开发(一)-控制GPS/WIFI/蓝牙/飞行模式...
- tensorflow基础之——自定义求导