2013-07-25 2 views
2

하나의 문제가 있습니다. 내 응용 프로그램에서는 AES 암호화 및 암호 해독을 사용하고 있습니다. 데이터를 암호화하여 서버 측에 보내면 암호화 된 데이터에 일부 정크 문자가 추가 된 것으로 나타납니다. 그러나 어떻게?AES 암호화가 블랙 베리에 정크 문자를 추가했습니다.

실제로이 암호화 된 데이터는 내 측면에서 완벽하게 해독되지만 서버에서 수신하면 정크 문자가 있습니다. 내가 서버의 암호 해독 로직에 액세스 할 수없는

public static byte[] encrypt(byte[] keyData, byte[] data) 
throws CryptoException, IOException 
{ 
    // Create the AES key to use for encrypting the data. 
    // This will create an AES key using as much of the keyData 
    // as possible. 

    AESKey key = new AESKey(keyData); 

    // Now, we want to encrypt the data. 
    // First, create the encryptor engine that we use for the actual 
    // encrypting of the data. 
    AESEncryptorEngine engine = new AESEncryptorEngine(key); 

    // Since we cannot guarantee that the data will be of an equal block 
    // length we want to use a padding engine (PKCS5 in this case). 
    PKCS5FormatterEngine fengine = new PKCS5FormatterEngine(engine); 

    // Create a BlockEncryptor to hide the engine details away. 
    ByteArrayOutputStream output = new ByteArrayOutputStream(); 
    BlockEncryptor encryptor = new BlockEncryptor(fengine, output); 

    encryptor.write(data); 

    encryptor.close(); 
    output.close(); 

    return output.toByteArray(); 
} 

참고 :

여기 내 암호화 코드입니다.

+2

AES와 같은 블록 암호에는 패딩이 필요합니다.암호화 된 데이터가 원본보다 더 길다는 것은 절대적으로 정상입니다. 내 생각에 클라이언트 측에서 아무 것도 할 필요가 없다. –

+0

서버 측 사람들은 분명히 암호화/해독을 처리하는 방법에 대한 단서를 가지고 있지 않습니다. 이 사실을 조직의 적절한 사람에게 알려줄 수 있습니다. 그들이하는 일은 완전히 안전하지 않습니다. –

답변

3

서버 측에서 해독하는지 또는 원래 데이터보다 많은 바이트가 있기 때문에 정크 문자로 호출하는지 명확하지 않습니다. 항상 16 바이트 이하의 바이트가 추가되면 데이터가 암호의 블록 크기로 나눌 수 있도록 PKCS5 패딩이 추가됩니다. 디 크립 터는 패드를 자동으로 제거하기 때문에 해독 후에는 보이지 않습니다.

그러나 Blackberry 문서를 보면 BlockEncryptor가 ECB 모드로 기본 설정되어 있으므로 암호화를 변경하는 것이 좋습니다. 이것은 일반 텍스트에 대한 정보가 아주 쉽게 유출되는 mode of operation입니다. 대신 BlockEncryptor의 서브 클래스를 선택하십시오 (예 : CBCEncryptorEngine). 나중에이 모델에서 해독을 위해 암호문과 함께 IV를 전송해야합니다.

Blackberry가 제공하는 것과 같은 구문을 사용하여 암호화를 구현할 때 매우주의하십시오. ECB를 사용하는 것처럼 실수를하는 것은 매우 쉽습니다. 결과적으로 암호문은 근본적으로 손상된 것처럼 보이게됩니다.

+0

하지만 서버 쪽 ECB 모드에서 사용하기 때문에 ECB 모드를 사용해야합니다 .. 블랙 베리에서 데이터를 암호화하는 동안 정크 문자를 제거하는 방법을 알려주십시오. –

+0

서버 측 제어 권한이있는 경우 변경하십시오. ECB는 보안 모드가 아닙니다. 제어권이 없으면 서버 측의 암호 해독이 패딩을 이해하지 못하는 것일 수 있습니다. 마지막 바이트의 값을 살펴 본다면 직접 제거 할 수 있습니다. PKCS5/PKCS7 패딩이라고 가정하면 그 바이트의 정수 표현은 무엇이든간에 스트립 할 바이트 수를 알려줍니다. 예를 들어, 03은 마지막 3 바이트를 제거해야 함을 의미합니다 (3은 모두 값 03 임). –

+0

Android 및 J2ME에서 암호화 된 데이터는 Blackberry를 제외한 서버 측에서 완벽하게 해독됩니다. 그래서 서버 쪽에서 우리는 암호 해독의 논리를 바꿀 수 없다. 그래서 나는 무엇이 문제인지 그리고 무엇을해야만하는지 이해할 수 없다. –

0

문제는 아마 당신이 보여주지 않은 암호 해독 코드에 있습니다. 암호 해독 중에 padding mode을 사용하지 않았을 가능성이 큽니다. 이 때문에 패딩 된 문자는 일반 텍스트처럼 취급됩니다. 다음과 같은 바이트 값을 포함하게됩니다.

01 
0202 
030303 

이것은 PKCS#5 padding or PKCS#7 padding으로 알려져 있습니다. 암호화 중에 사용자가 지정했습니다 (PKCS5FormatterEngine).

해독 후 서버 측에서 제거해야합니다. 가능한 경우 라이브러리를 사용하여이 작업을 수행하십시오. 이 패딩을 제거하는 것이 매우 간단하다 당신이 대답에 코멘트에 표시된 것처럼 서버 측을 변경할 수없는 경우, too.non 인쇄 할 수없는 문자


자신 바이트 있도록 PKCS # 5 패딩은 항상 추가 클라이언트 측을 0 바이트 패딩을 사용하도록 변경해야합니다. 이렇게하면 일반 텍스트를 블록 크기로 나눌 수있을 때까지 일반 텍스트에 0 바이트가 추가됩니다. 이것은 아마도 수동으로해야합니다. 서버 측은 단순히 일반 텍스트의 암호를 해독 한 다음 null로 끝나는 문자열을 사용하거나 보통 텍스트를 "트림"하여 공백 (종료 문자 포함)을 제거합니다. 그런 다음 암호화하지만, 물론 PKCS5FormatterEngine을 사용하지 않습니다. PKCS # 5도 제로 바이트 패딩 인증이나 무결성을 추가하지 않습니다, 당신은 패딩 이런 종류의 ECB/CBC 암호화를 사용하는 경우 다음 가능성이 padding oracle attacks에 취약하다는


참고. 일반 텍스트의 바이트 당 128 회 시도에서 일반 텍스트 검색.

+0

서버 측에서 PHP를 사용하고 있습니다 ... PKCS # 5 패딩이 포함되어 있지 않습니다. –

관련 문제