• python和nodejs的aes128加密对比


    之前的机器人是用python写的,有同事想改写成nodejs版,但是验证一直通不过,于是帮忙爬了一下文档。

    python版的代码大概是长这样:

    #encoding:utf8
    
    from Crypto.Cipher import AES
    import binascii
    
    key = 'abcdabcdabcdabcd'
    plaintext = 'Secret Message A'
    
    encobj = AES.new(key, AES.MODE_ECB)
    ciphertext = encobj.encrypt(plaintext)
    
    # Resulting ciphertext in hex
    print ciphertext.encode('hex')

    nodejs提供了两种方式创建加密,一种是crypto.createCipher(algorithm, password),另一种是crypto.createCipheriv(algorithm, key, iv)。从文档里可以看到,createCipher默认支持的是密码的加密方式,而不是key。这种方法底层会帮忙从密码推导出key和iv。而createCipheriv才是py版对应的AES.new。于是得到了nodejs版:

    var crypto = require("crypto");
    var key = new Buffer('abcdabcdabcdabcd','ascii');
    var text = 'Secret Message A';
    
    var cipher = crypto.createCipheriv('AES-128-ECB',key,'');
    var decipher = crypto.createDecipheriv('AES-128-ECB',key,'');
    var c1 = []
    var c2 = []
    c1.push(cipher.update(text, "ascii", "hex"))
    c1.push(cipher.final("hex"))
    var encrypted_text = c1.join('')
    console.log(encrypted_text)
    c2.push(decipher.update(encrypted_text, "hex", "ascii"))
    c2.push(decipher.final("ascii"))
    console.log(c2.join(''))

    但是有个问题,nodejs版加密出来的密文,总是比python版要长。感觉nodejs最后的final方法,输出了多余的东西。参考了一些网文,如果密文不够一个block,update是没有输出的,如果超过一个block,update只会输出一个block,剩余的放在final里返回。用python版解密看了一下,原来final在密文刚好一个block的情况下,会返回padding字符串。。。。

  • 相关阅读:
    在windows下拆卸Linux就是这么俭朴
    打点Linux下永中Office和桌面殊效的冲突
    Banshee 0.11.4
    ubuntu8.0中文输入法
    RedFlag 6.0 硬盘安置我解
    阅读器和把持体系和用户的IQ
    初试Fedora,最后还是Xubuntu
    VMware中放置Ubuntu后鼠标滚轮标题问题办理
    GNOME 的文件经管器将片面支撑标签式阅读
    ATI显卡开启fedora9的3d后果的一些条记
  • 原文地址:https://www.cnblogs.com/Lifehacker/p/nodejs_aes_encrypt_problem.html
Copyright © 2020-2023  润新知