Python и Java AES / ECB / PKCS5 шифрование - PullRequest
0 голосов
/ 30 августа 2018

ВЕРСИЯ JAVA:

public class EncryptUtil {
    public static String AESEncode(String encodeRules, String content) {
        try {
            KeyGenerator keygen = KeyGenerator.getInstance("AES");
            keygen.init(128, new SecureRandom(encodeRules.getBytes()));
        SecretKey original_key = keygen.generateKey();
        byte[] raw = original_key.getEncoded();
        SecretKey key = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] byte_encode = content.getBytes("utf-8");
        byte[] byte_AES = cipher.doFinal(byte_encode);
        return new String(Base64.getEncoder().encode(byte_AES));
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
       return null;
   }

}

Когда я запускаю этот код:

System.out.println(EncryptUtil.AESEncode("1234567812345678", python&java"));

У меня есть:

V5FFUgDi7VZaJ0qGzDISoA==

ВЕРСИЯ ПИТОНА:

import base64

from Crypto.Cipher import AES

BLOCK_SIZE = 16  # Bytes
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \
            chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)
unpad = lambda s: s[:-ord(s[len(s) - 1:])]


class AESUtil:
    __BLOCK_SIZE_16 = BLOCK_SIZE_16 = AES.block_size

    def __init__(self, key):
         self.key = key

    def encrypt(self, raw):
        raw = pad(raw)
        cipher = AES.new(self.key, AES.MODE_ECB)
        return base64.b64encode(cipher.encrypt(raw))

    def decrypt(self, enc):
        enc = base64.b64decode(enc)
        cipher = AES.new(self.key, AES.MODE_ECB)
        return unpad(cipher.decrypt(enc))

Я знаю, что Java использует AES / ECB / PKCS # 5 по умолчанию, но когда я запускаю метод encrypt:

cipher_text = AESUtil("1234567812345678").encryt('python&java')

есть: b'3mjygpK1d7ThCRK98ssZhA=='

Блокнот и блокнот я нашел их в Googles. Как мне отредактировать мой код PYTHON, чтобы cipher_text равнялся JAVA-шифрованию. Может кто-нибудь знает как это исправить?

1 Ответ

0 голосов
/ 30 августа 2018

Вы используете разные ключи шифрования

В Java

System.out.println (EncryptUtil.AESEncode ("1234567812345678", "python & java"));

См. Код:

KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(128, new SecureRandom(encodeRules.getBytes()));
SecretKey original_key = keygen.generateKey();
byte[] raw = original_key.getEncoded();

Если вы напечатаете ключ raw, вы получите fd839759956ba4a47922e8ee7c902f52 (в шестнадцатеричном коде), это ключ шифрования

Если вы хотите использовать предоставленный ключ напрямую, вы должны использовать

byte[] raw = encodeRules.getBytes(); 
// (assuming encodeRules has 16 bytes)

Как мне отредактировать мой код PYTHON, чтобы cipher_text равнялся JAVA-шифрованию

Это сложно ... вы можете посмотреть , как работает SecureRandom , но ИМХО проще исправить реализацию Java, чтобы создать ожидаемый ключ

Несмотря на то, что я считаю, что реализация недостаточно безопасна - используется ECB и простой ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...