получение разных результатов при кодировании с помощью python и при кодировании с помощью nodejs - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь кодировать определенную строку с помощью python с помощью pycrypto и кодировать эту же строку с помощью nodejs с помощью crypto.я получаю разные результаты в обоих случаях для одной и той же входной строки

код Python:

from Crypto.Cipher import AES
from hashlib import md5
import base64


password = 'aquickbrownfoxjumpsoverthelazydog'
input = 'hello+world'

BLOCK_SIZE = 16

def pad (data):
    pad = BLOCK_SIZE - len(data) % BLOCK_SIZE
    return data + pad * chr(pad)

def unpad (padded):
    pad = ord(padded[-1])
    return padded[:-pad]

def text_encrypt(data, nonce, password):
    m = md5()
    m.update(password)
    key = m.hexdigest()
    m = md5()
    m.update(password + key)
    iv = m.hexdigest()

    data = pad(data)

    aes = AES.new(key, AES.MODE_CBC, iv[:16])

    encrypted = aes.encrypt(data)
    return base64.urlsafe_b64encode(encrypted)

output = text_encrypt(input, "", password)
print output

и код nodejs выглядит следующим образом:

var crypto = require('crypto');

var password = 'aquickbrownfoxjumpsoverthelazydog';
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');

    var data = new Buffer(input, 'utf8').toString('binary');

    var cipher = crypto.createCipheriv('aes-256-cbc', key, iv.slice(0,16));

    var nodev = process.version.match(/^v(\d+)\.(\d+)/);
    var encrypted;

    if( nodev[1] === '0' && parseInt(nodev[2]) < 10) {
        encrypted = cipher.update(data, 'binary') + cipher.final('binary');
    } else {
        encrypted = cipher.update(data, 'utf8', 'binary') + cipher.final('binary');
    }

    var encoded = new Buffer(encrypted, 'binary').toString('base64');

    callback(encoded);
};

encrypt(input, password, function (encoded) {
    console.log(encoded);
});

результаты для обоих случаев различны, но после дешифрования они оба имеют тенденцию давать один и тот же правильный результат.

в чем здесь проблема?

1 Ответ

0 голосов
/ 19 мая 2018

Вы не указали, какие разные результаты вы получаете, но эти два результата должны дать одинаковый результат.Единственное отличие, которое я вижу, в используемом вами алфавите base64.

В Python вы звоните base64.urlsafe_b64encode(), что отличается от стандарта Base64 в каких символах он использует значения для 62 и 63 (- и _ вместо + и /).Чтобы получить тот же результат, либо в Python верните:

return base64.b64encode(encrypted)

Или постобработайте строку в кодировке base64 в Node.js:

encoded = encoded.replace(/_/g, '/').replace(/-/g, '+');

Все это сказано, как яКак уже упоминалось в моем комментарии, никогда не получайте IV из вашего пароля / ключа (или чего-либо еще детерминированного и неизменного)Для этого используйте криптографически безопасный PRNG .

...