Во-первых, я не специалист в области криптографии, поэтому принимайте этот ответ с некоторой умеренностью.
Что такое двойной размер 3DES?
тройной DES шифрование включает шифрование блока открытого текста в 8 байт в 8-байтового зашифрованного блока с двойной длины (16 байт) секретный ключ K = (K L || К Р) следующим образом:
Y = dES3 (K) [X] = DES (К л) [DES -1 (К R) [DES (К л) [Х]]]
Расшифровка происходит следующим образом:
Х = DES -1 (К л) [DES (К R) [DES -1 (К л) [Y]]]
Взятые из EMV 4.2: Book 2 - Security and Key Management.
Вот как можно было бы реализовать это в Java:
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Test3DES {
public static void main(String[] args) throws Exception {
//byte length has to be mutiple of 8!
String plaintext = "Attack at dawn!!";
byte[] plainBytes = plaintext.getBytes("UTF-8");
byte[] encrypted = encrypt(plainBytes);
byte[] decrypted = decrypt(encrypted);
System.out.println("Original message: ");
System.out.printf("Text: %s%n", plaintext);
System.out.printf("Raw bytes: %s%n", toHexString(plainBytes));
System.out.println("---");
System.out.println("Encrypted message: ");
System.out.printf("Text: %s%n", new String(encrypted, "UTF-8"));
System.out.printf("Raw bytes: %s%n", toHexString(encrypted));
System.out.println("---");
System.out.println("Decrypted message: ");
System.out.printf("Text: %s%n", new String(decrypted, "UTF-8"));
System.out.printf("Raw bytes: %s%n", toHexString(decrypted));
}
private static String toHexString(byte[] array) {
StringBuilder sb = new StringBuilder();
for (byte b : array) {
sb.append(String.format("%02X ", b));
}
return sb.toString();
}
private static byte[] encrypt(byte[] message) throws Exception {
Cipher encr1, decr2, encr3;
SecretKeySpec kL, kR, tmp;
kL = new SecretKeySpec(new byte[] {0, 1, 2, 3, 4, 5, 6, 7}, "DES");
kR = new SecretKeySpec(new byte[] {8, 9, 10, 11, 12, 13, 14, 15}, "DES");
encr1 = Cipher.getInstance("DES/ECB/NoPadding");
decr2 = Cipher.getInstance("DES/ECB/NoPadding");
encr3 = Cipher.getInstance("DES/ECB/NoPadding");
encr1.init(Cipher.ENCRYPT_MODE, kL);
decr2.init(Cipher.DECRYPT_MODE, kR);
encr3.init(Cipher.ENCRYPT_MODE, kL);
return encr3.doFinal(decr2.doFinal(encr1.doFinal(message)));
}
private static byte[] decrypt(byte[] message) throws Exception {
Cipher decr1, encr2, decr3;
SecretKeySpec kL, kR;
kL = new SecretKeySpec(
new byte[] {0, 1, 2, 3, 4, 5, 6, 7},
"DES"
);
kR = new SecretKeySpec(
new byte[] {8, 9, 10, 11, 12, 13, 14, 15},
"DES"
);
decr1 = Cipher.getInstance("DES/ECB/NoPadding");
encr2 = Cipher.getInstance("DES/ECB/NoPadding");
decr3 = Cipher.getInstance("DES/ECB/NoPadding");
decr1.init(Cipher.DECRYPT_MODE, kL);
encr2.init(Cipher.ENCRYPT_MODE, kR);
decr3.init(Cipher.DECRYPT_MODE, kL);
return decr3.doFinal(encr2.doFinal(decr1.doFinal(message)));
}
}
Выход:
Original message:
Text: Attack at dawn!!
Raw bytes: 41 74 74 61 63 6B 20 61 74 20 64 61 77 6E 21 21
---
Encrypted message:
Text: #�Jɚe�P�ϸ5�%t�
Raw bytes: 23 B4 4A C9 9A 65 C5 50 90 CF B8 35 9A 25 74 A2
---
Decrypted message:
Text: Attack at dawn!!
Raw bytes: 41 74 74 61 63 6B 20 61 74 20 64 61 77 6E 21 21
Так, чтобы ответить на ваш вопрос - вы ищете Размер ключа 16 байтов в коде. В моем фрагменте ключ состоит из kL
и kR
, которые составляют по 8 байт, всего 16.
Как вы ожидаете просмотреть код шифрования без существенного знания знаний в отношении шифрования? – zaph
Это, вероятно, устаревшая документация, или они просто не знают, о чем они говорят. В любом случае, DES и двухзначные 3DES не должны использоваться в настоящее время, поскольку они обеспечивают только 56 и 80 бит безопасности. Я предлагаю использовать AES, который имеет лучшую гарантию безопасности с наименьшим размером ключа, чем любой вариант DES/3DES. –