- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 CryptoJS (v 2.3) 加密 Web 应用程序中的字符串,我需要在服务器上使用 Python 对其进行解密,因此我使用的是 PyCrypto。我觉得我错过了什么,因为我不能让它工作。
这是 JS:
Crypto.AES.encrypt('1234567890123456', '1234567890123456',
{mode: new Crypto.mode.CBC(Crypto.pad.ZeroPadding)})
// output: "wRbCMWcWbDTmgXKCjQ3Pd//aRasZ4mQr57DgTfIvRYE="
python :
from Crypto.Cipher import AES
import base64
decryptor = AES.new('1234567890123456', AES.MODE_CBC)
decryptor.decrypt(base64.b64decode("wRbCMWcWbDTmgXKCjQ3Pd//aRasZ4mQr57DgTfIvRYE="))
# output: '\xd0\xc2\x1ew\xbb\xf1\xf2\x9a\xb9\xb6\xdc\x15l\xe7\xf3\xfa\xed\xe4\xf5j\x826\xde(m\xdf\xdc_\x9e\xd3\xb1'
最佳答案
这是 CryptoJS 3.1.2 的版本。始终注意以下事项(在两种语言中使用相同的内容):
如果将字符串作为 key
参数传递给 CryptoJS encrypt()
函数,则该字符串用于派生用于加密的实际 key 。如果您希望使用键(有效大小为 16、24 和 32 字节),则需要将其作为 WordArray 传递。
CryptoJS加密的结果是一个OpenSSL格式的密文字符串。要从中获取实际密文,您需要访问其上的 ciphertext
属性。
每次加密的 IV 必须是随机的,这样它在语义上是安全的。这样,攻击者无法仅通过查看密文就判断多次加密的同一个明文是否实际上是同一个明文。
下面是我做的一个例子。
JavaScript:
var key = CryptoJS.enc.Utf8.parse('1234567890123456'); // TODO change to something with more entropy
function encrypt(msgString, key) {
// msgString is expected to be Utf8 encoded
var iv = CryptoJS.lib.WordArray.random(16);
var encrypted = CryptoJS.AES.encrypt(msgString, key, {
iv: iv
});
return iv.concat(encrypted.ciphertext).toString(CryptoJS.enc.Base64);
}
function decrypt(ciphertextStr, key) {
var ciphertext = CryptoJS.enc.Base64.parse(ciphertextStr);
// split IV and ciphertext
var iv = ciphertext.clone();
iv.sigBytes = 16;
iv.clamp();
ciphertext.words.splice(0, 4); // delete 4 words = 16 bytes
ciphertext.sigBytes -= 16;
// decryption
var decrypted = CryptoJS.AES.decrypt({ciphertext: ciphertext}, key, {
iv: iv
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
带有 pycrypto 的 Python 2 代码:
BLOCK_SIZE = 16
key = b"1234567890123456" # TODO change to something with more entropy
def pad(data):
length = BLOCK_SIZE - (len(data) % BLOCK_SIZE)
return data + chr(length)*length
def unpad(data):
return data[:-ord(data[-1])]
def encrypt(message, key):
IV = Random.new().read(BLOCK_SIZE)
aes = AES.new(key, AES.MODE_CBC, IV)
return base64.b64encode(IV + aes.encrypt(pad(message)))
def decrypt(encrypted, key):
encrypted = base64.b64decode(encrypted)
IV = encrypted[:BLOCK_SIZE]
aes = AES.new(key, AES.MODE_CBC, IV)
return unpad(aes.decrypt(encrypted[BLOCK_SIZE:]))
警告:请记住,python2 和 pycrypto 都已过时,因此必须调整代码以适应 python3 和 pycryptodome。
其他注意事项:
您似乎想使用密码短语作为 key 。密码短语通常是人类可读的,但 key 不是。您可以使用 PBKDF2、bcrypt 或 scrypt 等函数从密码短语派生 key 。
上面的代码并不完全安全,因为它缺少身份验证。未经身份验证的密文可能会导致可行的攻击和不为人知的数据操纵。通常采用先加密后MAC的方案,具有良好的MAC功能,如HMAC-SHA256。
关于javascript - CryptoJS 和 Pycrypto 协同工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11567290/
我想在我的 AngularJS 应用程序中使用 CryptoJS,但我收到此错误:找不到变量:CryptoJS。 我将其包含在我的 index.html 中: 并尝试加密一些东西: var encr
这是我的 Anguarjs 代码 $httpProvider.defaults.headers.common['key'] = CryptoJS.AES.encrypt('', '=', {
我正在尝试在 CryptoJS 上解密并在 PyCrypto 上加密。 我看到 this 一个很好的答案,就像魅力一样,唯一的问题是它调整 PyCrypto 以与 CryptoJS 一起工作,我更喜欢
我正在尝试使用 CryptoJS AES,如下所示: var msg = "café"; var key = "something"; var c = CryptoJS.AES.encrypt(msg
我需要解密用 CryptoJS 加密的东西。我有用于加密的函数、加密对象的结构和用于加密的数据,但我需要知道该对象的一些值。 函数是: var c = CryptoJS.enc.Utf8.parse(
我正在使用 CryptoJS 手动解密具有一组提供的值的字符串。提供了 secret ,然后采用 SHA256。消息和初始化向量是 base 64 编码的。这就是我正在尝试的,但每次我运行它时,输出都
我有一个包含 SHA1 散列数据的密码表。所以我想用 CryptoJS 进行验证输入。它出错了..但是当我尝试显示它时,结果匹配..我编写了错误的函数吗? 这是我的代码 function checkC
我想使用类似于 SpeakEasy 的 javascript 创建一个 HOTP 客户端 上面的库是为服务器端 javascript 使用而设计的,它使用了 NodeJS。 我想在浏览器的前端 jav
我正在尝试编写一个应用程序,以在浏览器中使用 JS 对文件进行端到端加密。但是我似乎无法正确解密所有文件。 TL;DR 由于整体加密大于 1MB 的文件是不切实际的,因此我尝试逐 block 加密它们
我想连接到蓝牙设备。通信仅通过十六进制字符串。我需要编码一个 16 字节的值。因此,我还期望有一个 16 字节的值。在我的实现中,CryptoJS 总是返回更长的结果。根据文档,不需要 IV。 (“所
我在使用 CryptoJS 时遇到问题。 我尝试加密字符串,但它给出了不同的输出。 字符串:“测试消息” key :“123456” 这是我尝试运行的测试代码 var encrypted =
我正在尝试使用 CryptoJS 加密 32 个字符的字符串: var string = '12345678901234567890123456789012'. 我使用 AES256 的 32 个字符
我需要解密 JavaScript 中的十六进制消息,其结果与用 Java 编写的代码完全相同。然而,使用 CryptoJs 的 Javascript 版本返回一个空结果 Java中的代码: priva
我无法使用 jQuery 访问 encryptedData 变量,但在 alert 中它可以工作!!! $( document ).ready(function() { var te
我已经为 RSASHA256 编写了 javascript,但出现错误 crypto.js 未定义。 function aaa(message,secret) { ; ;
我正在尝试使用 CryptoJS 的 PBKDF2 和盐散列来存储我的密码。这是我对注册中的用户密码进行哈希处理的部分: var passwordInput = document.getElement
我正在学习各种哈希技术,并发现了有趣的库,从 cryptoJs 开始 在文档中,有多个选项定义如下散列哈马卡PBKDF2密码编码器 我理解散列是关于生成密文。 HMAC 的作用是生成消息验证代码。但我
我已经使用以下库很多年了,现在它不可用了。 http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/md5.js 有人可以帮忙寻找替代
我已经使用以下库很多年了,现在它不可用了。 http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/md5.js 有人可以帮忙寻找替代
我正在尝试将Node.js脚本 转换为Golang。但是,我在解码Base64时总是收到"error: illegal base64 data at input byte 40"错误。有人可以帮我,已
我是一名优秀的程序员,十分优秀!