zoukankan      html  css  js  c++  java
  • 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字符串。。。。

  • 相关阅读:
    JSON, String,Map,实体对象之间的转换
    使用mybatis-plus进行多表的条件查询(模糊查询)
    Netty整合WebSocket的使用
    Java流(stream)的使用
    mysql 查询当天、本周,本月,上一个月的数据......
    第七章 Centos7下Jira-8.16.1的安装
    第六章 JIRA基础介绍
    第五章 Confluence忘记密码
    第四章 Confluence服务的迁移
    第三章 Docker部署Confluence
  • 原文地址:https://www.cnblogs.com/Lifehacker/p/nodejs_aes_encrypt_problem.html
Copyright © 2011-2022 走看看