Tôi đang cố gắng mã hóa một số nội dung bằng Python và giải mã nó trong ứng dụng nodejs.Mã hóa và giải mã bằng python và nodejs
Tôi đang cố gắng để có được hai triển khai AES để làm việc cùng nhau mặc dù. Đây là nơi tôi đang ở.
Trong nút:
var crypto = require('crypto');
var password = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
var input = 'hello world';
var encrypt = function (input, password, callback) {
var m = crypto.createHash('md5');
m.update(password)
var key = m.digest('hex');
m = crypto.createHash('md5');
m.update(password + key)
var iv = m.digest('hex');
// add padding
while (input.length % 16 !== 0) {
input += ' ';
}
var data = new Buffer(input, 'utf8').toString('binary');
var cipher = crypto.createCipheriv('aes-256-cbc', key, iv.slice(0,16));
var encrypted = cipher.update(data, 'binary') + cipher.final('binary');
var encoded = new Buffer(encrypted, 'binary').toString('base64');
callback(encoded);
};
var decrypt = function (input, password, callback) {
// Convert urlsafe base64 to normal base64
var input = input.replace('-', '+').replace('/', '_');
// Convert from base64 to binary string
var edata = new Buffer(input, 'base64').toString('binary')
// Create key from password
var m = crypto.createHash('md5');
m.update(password)
var key = m.digest('hex');
// Create iv from password and key
m = crypto.createHash('md5');
m.update(password + key)
var iv = m.digest('hex');
// Decipher encrypted data
var decipher = crypto.createDecipheriv('aes-256-cbc', key, iv.slice(0,16));
var decrypted = decipher.update(edata, 'binary') + decipher.final('binary');
var plaintext = new Buffer(decrypted, 'binary').toString('utf8');
callback(plaintext);
};
encrypt(input, password, function (encoded) {
console.log(encoded);
decrypt(encoded, password, function (output) {
console.log(output);
});
});
này tạo ra kết quả:
BXSGjDAYKeXlaRXVVJGuREKTPiiXeam8W9e96Nknt3E=
hello world
Trong python
from Crypto.Cipher import AES
from hashlib import md5
import base64
password = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
input = 'hello world'
def _encrypt(data, nonce, password):
m = md5()
m.update(password)
key = m.hexdigest()
m = md5()
m.update(password + key)
iv = m.hexdigest()
# pad to 16 bytes
data = data + " " * (16 - len(data) % 16)
aes = AES.new(key, AES.MODE_CBC, iv[:16])
encrypted = aes.encrypt(data)
return base64.urlsafe_b64encode(encrypted)
def _decrypt(edata, nonce, password):
edata = base64.urlsafe_b64decode(edata)
m = md5()
m.update(password)
key = m.hexdigest()
m = md5()
m.update(password + key)
iv = m.hexdigest()
aes = AES.new(key, AES.MODE_CBC, iv[:16])
return aes.decrypt(edata)
output = _encrypt(input, "", password)
print(output)
plaintext = _decrypt(output, "", password)
print(plaintext)
này tạo ra sản lượng
BXSGjDAYKeXlaRXVVJGuRA==
hello world
Rõ ràng chúng rất gần, nhưng nút có vẻ là đệm đầu ra với một cái gì đó. Bất kỳ ý tưởng làm thế nào tôi có thể có được hai để tương thích?
1) Bạn có thực sự cần mã hóa mật khẩu dựa, thay vì sử dụng một chìa khóa ngẫu nhiên? 2) Nếu bạn làm thế, không sử dụng hàm băm đơn lặp. Sử dụng hàm muối và các hàm dẫn xuất khóa chậm, chẳng hạn như PBKDF2, bcrypt hoặc scrypt. – CodesInChaos
3) Bạn không sử dụng chính xác IV. Nó phải là một giá trị ngẫu nhiên mới cho mỗi tin nhắn. Nó cũng phải có cùng kích thước với kích thước khối và không phải là một nửa kích thước khối, như trong ví dụ của bạn. – CodesInChaos
Cảm ơn @CodeInChaos đây là mẫu mã vì vậy tôi đã đơn giản hóa một số trong số đó. Mật khẩu được tạo ra bằng cách sử dụng PBKDF2, và IV sẽ được ngẫu nhiên trong sản xuất. – dave