2014-03-05 2 views
1

나는 PHP를 사용하여 사용자가 몇 가지 가능한 알고리즘을 사용하여 텍스트를 여러 번 암호화 할 수있는 응용 프로그램을 작성하고 있습니다. 처음에는 이것이 정말로 간단하다고 생각했지만 데이터가 블록화되어 암호화되고 암호 해독되면 발생하는 문제에 대해 생각했습니다.다중 암호화/해독에 의한 데이터 혼돈

처음에는 패딩 전에 원래 데이터를 얻기 위해 모든 암호 해독 프로세스 후에 null 바이트를 제거 할 수 있다고 생각했습니다. 이제 데이터가 마지막에 여러 개의 null 바이트가있는 경우 해독 프로세스 후에 null 바이트를 제거하면 원래 데이터의 일부가 제거되고 데이터가 손실되고 잘못된 암호 해독으로 끝납니다 (마지막 포인트는 블록 크기에 따라 다릅니다. 다음 해독 알고리즘 중 하나). 여러 암호화 프로세스 이후에 데이터 나 데이터가 여러 개의 null 바이트를 포함 할 가능성은 거의 없지만 위에서 설명한 문제를 해결할 수있는 솔루션을 찾고 있습니다.

데이터에서 null-bytes를 제거하지 않으려는 경우 사용 된 알고리즘의 블록 크기에 따라 약간의 성가신 결과가 나타납니다. 3 개의 암호화 알고리즘을 가진 python programm를 작성했음을 보여주기 위해, 하나는 2 바이트의 블록 크기로 작동하고, 다른 하나는 3의 블록 크기로 작동하며, 마지막 하나는 4의 블록 크기를가집니다. 따라서 128-로 비교할 수 있습니다. 192 및 256 비트 알고리즘 임의의 바이트로 시작하여 여러 번 암호화 한 다음 모든 암호 해독 프로세스 후 null 바이트를 제거하지 않고 암호를 해독했습니다. ,

48 61 6c 6c 6f      //thats our data at the start 
da b4 28 fe 9e 4a     //now the 3-byte algorithm was run -> padded to 6 bytes 
5e 62 04 72 1a d8 d2 a4    //used the 4-byte algorithm -> padded to 8 bytes 
cc a1 43 e0 f5 e7 40 eb 81   //3-byte algorithm used again -> padded to 9 bytes 
48 61 7a 07 71 1e 3f 0f 05 8d 98 a4 //at last used the 4-byte algorithm -> padded to 12 bytes 
cc a1 43 e0 f5 e7 40 eb 81 00 00 00 //first encryption done, notice the three null-bytes and the similarity to line 4 
5e 62 04 72 1a d8 d2 a4 00 92 0f 2a //secound encryption done, not removed null-bytes "decrypted", but the rest goes well, as seen in line 3 
da b4 28 fe 9e 4a 00 00 84 1a 8d 03 //third encryption done, same as above, decryption of null-bytes results in chaos, but original data still the same 
48 61 6c 6c 6f 00 92 0f ae 88 98 be //last encryption, we got original data with some near random bytes 

최초의 복호 과정이 잘 어울리는 것을 볼 수 있으며, secound 하나 너무 다음을 programm 날 여기에서 몇 가지 의견 출력은 16 진수 형식의 모든 암호 해독/암호화 처리 후 바이트를 인쇄 "해독 된"3 패딩 바이트를 제외하고. 따라서 각 암호화 프로세스가 끝나면 원본 데이터에 더 가깝지만 이러한 패딩 바이트는 계속 암호화됩니다. (참고 : 누군가 내 암호화/암호 해독 기능에 의문이 생길 때마다 여러 번 100 번 테스트했으며 매번 작동했습니다. 필요하거나 의심스러운 경우 소스 코드를 게시 할 수도 있습니다)

이 모든 것을 간단한 질문에 넣으려면 , 데이터를 해독 할 때 어떤 null-bytes가 원본 데이터의 일부이고 암호화 알고리즘에 의해 추가되는지 어떻게 알 수 있습니까? 어떻게 할 수 있는지 아이디어가 있습니까?

+0

블록 크기가 2 바이트 인 암호가 약하게 들립니다. 나는 이것이 "생산"코드가 아닌 것 같아요? – ntoskrnl

+0

방금이 문제를 설명하기 위해 이것을 사용했는데 결과는 16, 24 또는 32 바이트 블록 크기와 같지만 샘플 출력은 훨씬 더 커졌습니다. – Sirac

+1

[이 질문] (http : //security.stackexchange.com/questions/18087/is-multiple-encryption-a-good-idea) 및 [이 블로그 게시물] (http://blog.cryptographyengineering.com/2012/02/multiple-encryption.html)을 참조하십시오. – ntoskrnl

답변

1

데이터를 0으로 채우는 대신 패딩 바이트 자체의 패딩 양을 인코딩하는 PKCS#7과 같은 패딩 모드를 사용할 수 있습니다. 이렇게하면 원래 평문 만 남겨두고 제거 할 수 있도록 해독시 패딩 바이트 수를 결정할 수 있습니다.

기본적으로 패딩 바이트는 모두 패딩이 추가 된 바이트 수입니다. 예 : 3 개의 패딩 바이트가 필요한 경우 패딩은 의 3 바이트가됩니다.

항상 적어도 1 바이트의 패딩 즉, 일반 텍스트가 이미 블록 크기의 배수이면 패딩으로 만 구성된 추가 블록을 추가해야한다는 것을 의미합니다. 이렇게하면 블록 크기의 정확한 배수이고 정확히 이 n 바이트 인 n으로 끝나는 일반 텍스트와 n 바이트로 채워진 일반 텍스트를 구별 할 수 있습니다.

+0

감사합니다.이 질문은 잠 못 이루는 밤을 보내고 어떻게 든 나는 그 해결책을 쉽게 생각할 수 없었습니다. – Sirac