[英]3DES crypto on Python produces different result from Nodejs/Java
我正在建立一個需要信用卡 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)
Result: b'+TSfdiGmLAir8RVEze4yr72d3Sm5RBkDBwLYhpv1NKIIfVM+AnIhoSArFzV5am7qOdaFO0Ob4KSS8vXRYnBAO1xyk9MEoNc93uf/53cCMVHbZ8FUx14Vilx3Mg8+kbSMsASki5Dn+hlKE0ElFC/nyiWoOJvkWmtndoL+EEb4rkFil0zg637YXFE7f0yTOWhz97G6CEb4mvegCPpizuVdh2sBQQFDsJMEQE1kGeY2gDiDADwRQiMTrznhWFn3H6SylMxjQaNJTxu820BNitefMgcwAUTUJSrZt6DyuJ59e7772DK2jLubpK8/8xNolKalcjYMx106T7jOxDoPWZEoIe7YSGn9+Z3IGe5R7YFQJVLJUJ3SzlwWLptr3ZbMRnDCh2rB4FbTsM4igic4ZUQjS3DUzUVpT5URQyGjJK9+434ivMehknko4x+1owaEgcLGsPT9zBADlKFQ+OE8JqOhwJ5IztyoWeOmBVPZsOQdYvo='
節點代碼:
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)
Result: '7pkXCZCKIDY1ueGwkfLk5W5AnDw2iP4jiZ5YHUBRMd56eDhVyZvnJ6EG+mh/wmHl3ljrJ+sfDMgAbpOgljRRQb4pOc1LQKHdkgcl3ZWmlvmqv8mGKdGaZYTgXnQ9pZGwoUQJAcuQgOCYWD5wMvIA6g4zd8O1iy/IsXWkBEzCkQA3x6NIkwrCNdftogu3JZlbmOIj90flo8t+J2X89rXzQmWKw6uCWrzzfGQvmvqqNf7ecDduTtCXee3WCdvcC3Ar7TbVpSv+NenoK+Oh+Tkj6Y8h4t6YAexyE8HxQ1GqCqFlMAzdCa2TtA=='
NodeJS 正在生成正確的結果。 我需要在 Python model 上糾正什么?
Python 代碼與 NodeJS 代碼不同的原因如下:
使用 json.dumps() 轉換為 JSON 字符串與使用json.dumps()
JSON.stringify()
轉換略有不同。 json.dumps()
與JSON.stringify()
不同,在分隔符后插入空格(為了更好的可讀性),請參見此處。 為避免這種情況,請使用以下修改:
dataJSON = json.dumps(data, separators=(',', ':'))
在 NodeJS 代碼中,填充是使用 PKCS7隱式完成的,但在 Python 中沒有。 這里必須顯式執行填充,PyCryptodome 提供了一個填充模塊:
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 所取代。 在這里。 除此之外,使用 static IV 通常是不安全的,s here 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.