Triple Des коды, возвращающие шифр разной длины - PullRequest
0 голосов
/ 08 февраля 2019

Я получил этот код от сервера, ребята:

public string Encryption(string PlainText)
{
string key = "twelve_digit_key";
TripleDES des = CreateDES(key);
ICryptoTransform ct = des.CreateEncryptor();
byte[] input = Encoding.Unicode.GetBytes(PlainText);
byte[] buffer = ct.TransformFinalBlock(input, 0, input.Length);

return Convert.ToBase64String(buffer);
}

static TripleDES CreateDES(string key)
{
 MD5 md5 = new MD5CryptoServiceProvider();
 TripleDES des = new TripleDESCryptoServiceProvider();
 des.Key = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
 des.IV = new byte[des.BlockSize / 8];
 return des;
}

Это мой код, указанный выше:

 public String encryptDES(String message) throws Exception {
    final MessageDigest md = MessageDigest.getInstance("md5");
    final byte[] digestOfPassword = md.digest(getNativeKey3().getBytes("utf-8"));
    final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
    for (int j = 0, k = 16; j < 8; ) {
        keyBytes[k++] = keyBytes[j++];
    }

    final SecretKey key = new SecretKeySpec(digestOfPassword, "DESede");
    final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
    final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS7Padding");
    cipher.init(Cipher.ENCRYPT_MODE, key, iv);

    final byte[] plainTextBytes = message.getBytes("utf-8");
    final byte[] cipherText = cipher.doFinal(plainTextBytes);

    return Base64.encodeToString(cipherText, Base64.DEFAULT)
        .replace("\n", "")
        .replace("\r", "");
}

Проблема:

Первый код дает следующий результат:

  • Зашифрованный текст для 121212: VvRQkSUj5SQ69mGXsL + h6w ==

Но второй кодвозвращает это:

  • Зашифрованный текст для 121212 равен 2STVJSd1mnw =

Наблюдения:

  • Когда я увеличиваю открытый текст до 10 цифр, я получаю 24-значный текст шифра

Может ли кто-нибудь помочь мне в этом:

Заранее спасибо

1 Ответ

0 голосов
/ 08 февраля 2019

Вас обманул плохо названный класс Unicode, который фактически определяет UTF-16LE, а не UTF-8.

Вы можете использовать StandardCharsets.UTF_16LE для указания кодировки, а не строки;это избавляет вас от одного исключительного случая для обработки.

Если с длиной все еще есть проблемы (тест!), то вам, возможно, придется иметь дело с меткой порядка байтов или спецификацией - но я так не думаю.

...