2012-07-03 3 views
2

У меня есть следующие C# реализация тройного DESMatching Java Triple DES результат C# один

byte[] bKey = HexToBytes("C67DDB0CE47D27FAF6F32ECA5C99E8AF"); 
byte[] bMsg = HexToBytes("ff00"); 
byte[] iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
des.Padding = PaddingMode.Zeros; 
des.Mode = CipherMode.CBC; 
byte[] bK1 = new byte[8]; 
for (int i = 0; i < 8; i++) bK1[i] = bKey[i]; 
byte[] bK2 = new byte[8]; 
for (int i = 0; i < 8; i++) bK2[i] = bKey[i + 8]; 
ICryptoTransform ict1 = des.CreateEncryptor(bK1, iv); 
byte[] bFt = ict1.TransformFinalBlock(bMsg, 0, bMsg.Length); 
byte[] bLCb = new byte[8]; 
for (int i = 0; i < 8; i++) bLCb[i] = bFt[i + bFt.Length - 8]; 
des.Mode = CipherMode.ECB; 
ICryptoTransform ict1_5 = des.CreateDecryptor(bK2, iv); 
bLCb = ict1_5.TransformFinalBlock(bLCb, 0, bLCb.Length); 
ICryptoTransform ict2 = des.CreateEncryptor(bK1, iv); 
byte[] bMac = ict2.TransformFinalBlock(bLCb, 0, bLCb.Length); 

ToHex(bMac); // outputs: 4BC0479D7889CF8E 

Мне нужно производить такой же результат в Java/Groovy, в котором я нахожусь, видимо, застрял. код у меня есть на данный момент выглядит следующим образом:

byte[] bKey = Hex.decode("C67DDB0CE47D27FAF6F32ECA5C99E8AF") 
byte[] bMsg = Hex.decode("ff00") 

byte[] keyBytes = Arrays.copyOf(sKey.bytes, 24) 
int j = 0, k = 16 
while (j < 8) { 
    keyBytes[k++] = keyBytes[j++] 
} 

SecretKey key3 = new SecretKeySpec(keyBytes, "DESede") 
IvParameterSpec iv3 = new IvParameterSpec(new byte[8]) 
Cipher cipher3 = Cipher.getInstance("DESede/CBC/PKCS5Padding") 
cipher3.init(Cipher.ENCRYPT_MODE, key3, iv3) 

byte[] bMac = cipher3.doFinal(bMsg) 
println new String(Hex.encode(bMac)) 

Это один outpus: ef2c57c3fa18d0a5

Hex.decode() здесь имеет Надувной замок

Я также попытался воспроизвести тот же C# код в Java с помощью DES/CBC дважды и EBC в финальном раунде, что дало мне другой результат: 48f63c809c38e1eb

Было бы здорово, если бы кто-нибудь мог дать мне намек на то, что я могу делать неправильно

Update:

Спасибо всем за помощь! Конечный код, который работает по мере необходимости без большой настройки:

Security.addProvider(new BouncyCastleProvider()) 
byte[] bKey = Hex.decode("C67DDB0CE47D27FAF6F32ECA5C99E8AF") 
byte[] bMsg = Hex.decode("ff00") 

byte[] keyBytes = Arrays.copyOf(sKey.bytes, 24) 
int j = 0, k = 16 
while (j < 8) { 
    keyBytes[k++] = keyBytes[j++] 
} 

SecretKey key3 = new SecretKeySpec(keyBytes, "DESede") 
IvParameterSpec iv3 = new IvParameterSpec(new byte[8]) 
Cipher cipher3 = Cipher.getInstance("DESede/CBC/ZeroBytePadding") 
cipher3.init(Cipher.ENCRYPT_MODE, key3, iv3) 

byte[] bMac = cipher3.doFinal(bMsg) 
println new String(Hex.encode(bMac)) 
+0

Что вы ожидаете от 'HexToBytes (« foobar »)', чтобы дать вам? Вы не показали метод, но он звучит так, как будто он ожидает hex - и 'foobar' не является шестнадцатеричным ... (Вы не делаете никакого шестнадцатеричного преобразования в Java-коде, я замечаю ...) –

+0

@JonSkeet вот ссылка на полный код C# [ссылка] (http://rextester.com/UWUW35818) –

+0

@JonSkeet Я попытался декодировать/закодировать ключ и сообщение на HEX, используя Bouncy Castle 'Hex.decode()'. Это приводит к разным результатам, чем выше –

ответ

4

Используется нестандартная прокладка и блокировка цепей. Вы не сможете использовать DESede. Попробуйте вместо этого DES:

import javax.crypto.* 
import javax.crypto.spec.* 

def key1 = new SecretKeySpec("C67DDB0CE47D27FA".decodeHex(), "DES") 
def key2 = new SecretKeySpec("F6F32ECA5C99E8AF".decodeHex(), "DES") 
def plaintext = ("ff00" + "000000000000").decodeHex() // manually zero pad 

def c1 = Cipher.getInstance("DES/CBC/NoPadding") 
c1.init(Cipher.ENCRYPT_MODE, key1, new IvParameterSpec(new byte[8])) 
def cipherText1 = c1.doFinal(plaintext) 

def c2 = Cipher.getInstance("DES/CBC/NoPadding") 
c2.init(Cipher.DECRYPT_MODE, key2, new IvParameterSpec(new byte[8])) 
def cipherText2 = c2.doFinal(cipherText1) 

def c3 = Cipher.getInstance("DES/ECB/NoPadding") 
c3.init(Cipher.ENCRYPT_MODE, key1) 
def cipherText3 = c3.doFinal(cipherText2) 

assert cipherText3.encodeHex().toString() == "4bc0479d7889cf8e" 
+0

Спасибо за ваше время! Простой и описательный код заставил меня понять этот аспект 3DES –

Смежные вопросы