当前位置: 首页 > 知识库问答 >
问题:

AES在cryptojs中加密和在python Crypto.cipher中解密

薛楷
2023-03-14
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script>
    var message='Secreat Message to Encrypt';
    var key = CryptoJS.enc.Hex.parse('824601be6c2941fabe7fe256d4d5a2b7');
    var iv  = CryptoJS.enc.Hex.parse('1011121314151617');

    var encrypted = CryptoJS.AES.encrypt(message, key, { iv: iv, mode: CryptoJS.mode.CBC });
    encrypted =encrypted.toString();


    encrypted = iv+encrypted;
    encrypted = btoa(encrypted);
    console.log('encrypted',encrypted );    
    alert(encrypted); 

   // var decrypted =  CryptoJS.AES.decrypt(encrypted, key, { iv: iv, mode: CryptoJS.mode.CBC });
   // console.log('decrypted', decrypted);
   //alert(decrypted.toString(CryptoJS.enc.Utf8));
</script>

在用于aes加密和解密的python脚本中

#!/usr/bin/python

import os, random, struct
from Crypto.Cipher import AES
from Crypto import Random
import base64
class AESCipher:
    def __init__(self, key):
        BS = 16
        self.pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
        self.unpad = lambda s : s[0:-ord(s[-1])]
        self.key = self.pad(key[0:16])

    def encrypt(self, raw):
        raw = self.pad(raw)
        iv = "1011121314151617"
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return base64.b64encode(iv + cipher.encrypt(raw))

    def decrypt(self, enc):
        enc = enc.replace(' ', '+')
        enc = base64.b64decode(enc)
        iv = enc[:16]
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return self.unpad(cipher.decrypt( enc[16:]))


def main():     

    cipher = AESCipher('824601be6c2941fabe7fe256d4d5a2b7')
    encrypteddata =cipher.encrypt(''Secreat Message to Encrypt'')
    print encrypteddata         

    decryptdata =cipher.decrypt(encrypteddata)
    print decryptdata 

main()

但是相同的iv、消息和密钥在python和js中产生不同的加密消息,

JavaScript与python解密兼容的问题是什么?

两者都使用了aes.mode_cbc,并且假设两者都使用了Pkcs7填充。硬编码iv现在是随机生成的

共有1个答案

方和宜
2023-03-14

尝试使用实际上与AES块大小相同的IV(16字节)。您当前指定的是十六进制8字节。CBC模式需要一个与块大小相同大小的IV,Python API指定(包括最终的键入):

对于所有其他模式,它必须是block_size字节长。

最好使用方法或(预定义的)常量,如上。

 类似资料:
  • 我有一个问题解密文本,它是在Go lang加密,使用CryptoJS。 下面是Go代码:https://play.golang.org/p/xcbl48t_in 这里是JS代码:http://jsfidle.net/ltkxm64n/ 这两种方法都能很好地加密和解密,但是当我将base64密文从GO复制到JS(或者反过来)时,它就不起作用了。我还注意到js输出的第一部分与Go输出相同,但在js输出

  • 我之所以问这个问题,是因为两天来我读了很多关于crypto AES加密的帖子,就在我以为我得到了它的时候,我意识到我根本没有得到它。 这个帖子是最接近我的问题,我有完全相同的问题,但它没有得到回答: CryptoJS AES加密与JAVA AES解密值不匹配 我得到的是已经加密的字符串(我得到的代码只是为了看看他们是怎么做的),所以修改加密方式不是一个选项。这就是为什么所有类似的问题对我来说都不是

  • 客户端: 服务器端:

  • 问题内容: 我在使用CryptoJS解密在Go lang中加密的文本时遇到问题。 这是Go代码:https : //play.golang.org/p/xCbl48T_iN 这是JS代码:http: //jsfiddle.net/Ltkxm64n/ 两者都可以很好地进行加密和解密,但是当我将base64密文从GO复制到JS(反之亦然)时,它不起作用。我还注意到js输出的第一部分与Go输出相同,但是

  • 我正在尝试使用Javascript和CryptoJS复制Java应用程序中使用的加密。我不太确定应该如何复制SecretKeySpec,因为CryptoJS似乎需要一个字符串作为密钥。 下面是我需要在JS中复制的Java加密代码: 到目前为止,我的JS代码: 此外,密码的最终输出是一个加密的字节数组。CryptoJS的最终输出似乎是一个带有密文的对象。有没有办法以字节数组的形式获取输出? 我现在唯

  • 注意:这只是为个人使用和学习,我不是试图滚动我自己的加密为公众使用。 我需要AES256加密一个字符串,但是我当前的尝试在十六进制解码时最终得到了一个类似server side的字符串。当十六进制解码时,它应该是一个有效的utf8 base64字符串,然后可以将其解码为原始字符串。这与这里提供的解决方案类似,但是salt并不是实际问题(尽管答案被接受),并且我无法在使用之前通过十六进制解码iv来抑