【问题标题】:3DES crypto on Python produces different result from Nodejs/JavaPython 上的 3DES 加密产生与 Nodejs/Java 不同的结果
【发布时间】:2021-03-09 10:03:22
【问题描述】:

我正在建立一个需要信用卡 3DES 加密的结帐, 但我在 Python 和 NodeJs 上得到了不同的结果。

Python 代码: (我使用 pycryptodome 包)

import binascii
import base64
from Crypto.Cipher import DES3
import json

iv = '04njBuE3/dc='
iv = base64.b64decode(iv)
key = 'DpzDLcvVCHdVoRqE/NuIHs0QJ0xFdH2p'
key = base64.b64decode(key)
data = {'CartaoNumero': '0000000000000000',
'CartaoMesAno':'00/0000',
'CartaoSeg': '000',
'CartaoNome':'Teste Teste',
'IdentFatura':'Teste',
'Valor':'1000',
'NomeCliente':'Teste Teste',
'EmailCliente':'teste@teste.com',
'CpfCliente':'11122233344'}
data = json.dumps(data)
data = base64.b64encode(data.encode('utf-8'))
#print (data)

def card_encrypt(iv,key, data):
    desT = DES3.new(key, DES3.MODE_CBC, IV=iv)
    desT_key = desT.encrypt(data)
    desT_key = base64.b64encode(desT_key)
    return (desT_key)

结果: B '+ TSfdiGmLAir8RVEze4yr72d3Sm5RBkDBwLYhpv1NKIIfVM + AnIhoSArFzV5am7qOdaFO0Ob4KSS8vXRYnBAO1xyk9MEoNc93uf / 53cCMVHbZ8FUx14Vilx3Mg8 + kbSMsASki5Dn + hlKE0ElFC / nyiWoOJvkWmtndoL + EEb4rkFil0zg637YXFE7f0yTOWhz97G6CEb4mvegCPpizuVdh2sBQQFDsJMEQE1kGeY2gDiDADwRQiMTrznhWFn3H6SylMxjQaNJTxu820BNitefMgcwAUTUJSrZt6DyuJ59e7772DK2jLubpK8 / 8xNolKalcjYMx106T7jOxDoPWZEoIe7YSGn9 + Z3IGe5R7YFQJVLJUJ3SzlwWLptr3ZbMRnDCh2rB4FbTsM4igic4ZUQjS3DUzUVpT5URQyGjJK9 + 434ivMehknko4x + 1owaEgcLGsPT9zBADlKFQ + OE8JqOhwJ5IztyoWeOmBVPZsOQdYvo =' P>

Nodejs 代码:

var secretKey = 'DpzDLcvVCHdVoRqE/NuIHs0QJ0xFdH2p'
 var secretIV = '04njBuE3/dc='
 var dataOfCard = {'CartaoNumero': '0000000000000000',
'CartaoMesAno':'00/0000',
'CartaoSeg': '000',
'CartaoNome':'Teste Teste',
'IdentFatura':'Teste',
'Valor':'1000',
'NomeCliente':'Teste Teste',
'EmailCliente':'teste@teste.com',
'CpfCliente':'11122233344'}

const crypto = require('crypto');
 
async function encryptCardData(dataOfCard, secretKey, secretIV) {
    try {
        const des3_key = new Buffer.from(secretKey, "base64");
        console.log(des3_key)
        const des3_iv = new Buffer.from(secretIV, "base64");
        console.log(des3_iv)
        const cardString = JSON.stringify(dataOfCard);
        console.log(cardString)
      
        const cipher = crypto.createCipheriv('des-ede3-cbc', des3_key, des3_iv);

        const encrypted = cipher.update(cardString, 'utf8', 'base64');
    
        return encrypted + cipher.final('base64');        
    } catch (error) {
        console.error("Error:", error.message);
        throw error;
    }
}

encryptCardData(dataOfCard, secretKey, secretIV)

结果: '7pkXCZCKIDY1ueGwkfLk5W5AnDw2iP4jiZ5YHUBRMd56eDhVyZvnJ6EG + MH / wmHl3ljrJ + sfDMgAbpOgljRRQb4pOc1LQKHdkgcl3ZWmlvmqv8mGKdGaZYTgXnQ9pZGwoUQJAcuQgOCYWD5wMvIA6g4zd8O1iy / IsXWkBEzCkQA3x6NIkwrCNdftogu3JZlbmOIj90flo8t + J2X89rXzQmWKw6uCWrzzfGQvmvqqNf7ecDduTtCXee3WCdvcC3Ar7TbVpSv + NenoK + OH + Tkj6Y8h4t6YAexyE8HxQ1GqCqFlMAzdCa2TtA ==' P>

NodeJS 正在生成正确的结果。 我需要在 Python 模型上更正什么?

【问题讨论】:

    标签: python node.js encryption cryptography 3des


    【解决方案1】:

    Python 代码与 NodeJS 代码不同的原因如下:

    • json.dumps() 转换为 JSON 字符串与JSON.stringify() 的转换略有不同。 json.dumps()JSON.stringify() 不同,在分隔符之后插入空格(为了更好的可读性),请参阅 here。为避免这种情况,请使用以下修改:

      dataJSON = json.dumps(data, separators=(',', ':'))
      
    • 在 NodeJS 代码中,填充是使用 PKCS7隐式完成的,但在 Python 中则不然。这里必须显式地执行填充,PyCryptodome 提供了一个padding module:

      from Crypto.Util.Padding import pad
      ...
      dataPadded = pad(dataJSON.encode('utf-8'), 8)
      

      8 是以字节为单位的 3DES 块大小。

    • 必须删除数据的Base64编码:

      #data = base64.b64encode(data.encode('utf-8'))
      

    这样:

    ciphertext = card_encrypt(iv,key, dataPadded)
    print (ciphertext)
    

    返回密文:

    b'7pkXCZCKIDY1ueGwkfLk5W5AnDw2iP4jiZ5YHUBRMd56eDhVyZvnJ6EG+mh/wmHl3ljrJ+sfDMgAbpOgljRRQb4pOc1LQKHdkgcl3ZWmlvmqv8mGKdGaZYTgXnQ9pZGwoUQJAcuQgOCYWD5wMvIA6g4zd8O1iy/IsXWkBEzCkQA3x6NIkwrCNdftogu3JZlbmOIj90flo8t+J2X89rXzQmWKw6uCWrzzfGQvmvqqNf7ecDduTtCXee3WCdvcC3Ar7TbVpSv+NenoK+Oh+Tkj6Y8h4t6YAexyE8HxQ1GqCqFlMAzdCa2TtA=='
    

    与 NodeJS 代码的密文匹配。

    请注意,3DES 已被弃用,应替换为例如更现代和性能更高的 AES,s。 here。除此之外,使用静态 IV 通常是不安全的,s here

    【讨论】:

    • 太棒了!效果很好!!谢谢你的帮助!!
    猜你喜欢
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    相关资源
    最近更新 更多