2016-08-10 4 views
0

Я просматриваю приложение, и мы должны проверить алгоритм шифрования и силу используемых ключей. Из моего обзора кода, что я могу выяснить, они используют алгоритм 3DES, который я понял из строки, которая упоминает «DES/ECB/NoPadding».Найдите, используется ли 3DES с двойной длиной или тройной длиной

Однако после поиска по шифрованию я понял, что упомянутое выше шифрование имеет только размер ключа 56 бит. Упоминание ссылка приведена ниже:

Однако разработчики приложений говорят, что они используют двойной 3DES длину. С приведенными выше данными мы можем только понять, что 3DES используется, не может определить ключ. Приложение разработано в JAVA.

Может кто-нибудь помочь мне в том, что может быть способ узнать, что используется двойная длина или тройная длина 3DES?

(ИЛИ)

Обеспечить двойную длину или тройной длины детали реализации 3DES? так что мы можем выяснить, что можно использовать в моей ситуации.

+2

Как вы ожидаете просмотреть код шифрования без существенного знания знаний в отношении шифрования? – zaph

+1

Это, вероятно, устаревшая документация, или они просто не знают, о чем они говорят. В любом случае, DES и двухзначные 3DES не должны использоваться в настоящее время, поскольку они обеспечивают только 56 и 80 бит безопасности. Я предлагаю использовать AES, который имеет лучшую гарантию безопасности с наименьшим размером ключа, чем любой вариант DES/3DES. –

ответ

1

Если они используют javax.crypto только с DES/ECB/NoPadding, то они не используют 3DES, они используют DES. Не только это, они используют ECB, что определенно не рекомендуется. Конечно, они могли бы перевернуть свою собственную «двойную длину 3DES» (что бы это ни значило) со стандартным DES, но это еще один предупреждающий знак.

P.S. Если вам нужно было использовать Google для шифрования, почему вы даже просматриваете код? Вы не знаете, защищен ли код или нет, о чем свидетельствует этот вопрос.

+0

Обратите внимание, что моллюски OP являются «аналитиком безопасности». – zaph

+0

Внештатный аналитик по вопросам безопасности, ой. – Kayaman

+0

Я не кто-то с кодирующим фоном, ни аналитик по кодированию, аналитики безопасности не относятся к другим аспектам безопасности. Мысль о помощи от экспертов, но, похоже, некоторые из них здесь только для того, чтобы похвастаться собой. Я не хочу, чтобы вы просмотрели его для меня, просто указав, что правильного подхода было более чем достаточно. Большое спасибо. – mjoi

0

Во-первых, я не специалист в области криптографии, поэтому принимайте этот ответ с некоторой умеренностью.

Что такое двойной размер 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.

+0

Поскольку зашифрованные данные представляют собой по существу случайные байты, а не печатные символы, то обычно представляется шестнадцатеричным, '# Jɚe P ϸ5 % t ' бессмыслен и даже не правильная длина. Было бы также странно использовать три экземпляра DES для шифрования и использования 3DES, многие реализации 3DES, которые, если они представлены 16-байтовым ключом, по умолчанию будут использовать первые 8 байтов для 3-го 8-байтового. Интересно, что ключи являются плохим примером, потому что DES игнорирует lsb каждого байта, этот бит первоначально использовался для контроля четности, таким образом, '{0,1,2,3,4,5,6,7}' и '{0,0 , 2,2,4,4,6,6} 'являются по сути одним и тем же ключом. – zaph

+0

@zaph Я понимаю теперь, что печатное представление символов - это плохой выбор - вы можете отредактировать свой ответ, если я этого не сделаю перед вами. Итак, вы говорите, что я должен использовать 3DES с ключом '{kL, kR, kL}'? Кажется, это лучшая идея! И о ключах я не думаю, что сила важна в этом контексте, но все же ... спасибо, что указали это. –

+0

@zaph И было указано в вопросе о том, что Ciphers были созданы с использованием алгоритма ** DES/ECB/NoPadding **. Если этот вопрос будет полезен, я все же думаю, что он должен сохранить эту форму и, возможно, просто упомянуть улучшения. –

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