2011-07-29 1 views
3

AES, CBC 블록 크기가 16 바이트, 키가 256 비트 인 파일을 암호화해야합니다. 그리고 파일은 16 바이트의 배수로 제로 패딩되어야합니다. 그리고 파일을 암호화 한 후에는 패딩 된 0의 양을 끝에 추가해야합니다.Android AES 암호화 Zero Padding

예를 들어 파일이 9 바이트 인 경우 7 바이트가 추가됩니다. 16 바이트가 암호화되고 읽은 데이터의 길이 9가 끝에 추가됩니다. 따라서 전체 길이는 암호화되지 않은 마지막 바이트로 17 바이트 여야합니다.

저는 Cipher 클래스를 사용하고 있으며 "AES/CBC /"를 사용하고 있지만 원하는 내용을 설명하는 패딩 메서드가 있는지 여부는 알 수 없습니다.

EDIT : 마지막 바이트는 마지막 16 바이트 패딩 된 셀의 실제 데이터가 몇 바이트가되어야합니다.

+0

, 당신은 어떻게 올바른 패딩이나와 버퍼를 구성하는 요구하고, 문제를 확실히 이해하지? – Idistic

+0

패딩 메서드의 이름이 있는지 알고 싶습니까? 아니면 수동으로 수행해야합니까? 그리고 이름이 있다면 그것은 지원됩니까? – Hank

+0

timothyjc의 답변에서 설명한대로 패딩 메커니즘이 있으므로 패딩이 처리됩니다. "AES/ECB/PKCS7Padding"은 최대 255 바이트의 블록 크기를 처리합니다. – Idistic

답변

0

안드로이드는 JCE를 통해 필요한 모든 라이브러리를 가지고 있기 때문에 수동으로 할 필요가 없습니다. 당신은 내 경우 PKCS5Padding에 있던 패딩 방식에 관심을 지불 할 수 있습니다 http://pocket-for-android.1047292.n5.nabble.com/Encryption-method-and-reading-the-Dropbox-backup-td4344194.html#a4454327

:

나는 내가 여기에 안드로이드 앱 쓴 일부 AES의 encryotion 코드를 기록했다.

+0

구체적으로 찾고자하는 것은 패딩의 이름입니다 계획, 내가 내 질문에 위에서 설명한 것. – Hank

+0

ANSI X.923 ... http://stackoverflow.com/questions/1329730/java-ansi-x923-padding, http://en.wikipedia.org/wiki/Padding_%28cryptography%29를 시도 할 수 있습니다. – timothyjc

+0

길이 바이트도 암호화되기 때문에 ANSI X.923은 비슷하지만 동일하지는 않습니다. – Hank

2

문제를 이미 해결했는지 확신 할 수 없지만 찾고있는 패딩 유형은 입니다. ZeroBytePadding입니다. 이 코드는 2.3.3 시뮬레이터에 나를 위해 작동 : 나는 문을 이해

String stringKey = "60380131061660211660380426804995"; 
String message = "This is a secret message"; 
try { 
    SecretKeySpec sks = new SecretKeySpec(stringKey.getBytes(),"AES"); 
    Cipher c = Cipher.getInstance("AES/ECB/ZeroBytePadding"); // Change to CBC and use appropriate IV 
    c.init(Cipher.ENCRYPT_MODE, sks); 
    c.update(message.getBytes()); 
    byte[] ciphertext = c.doFinal(); 
    Log.i("CE", new String(ciphertext)); 

    } catch (NoSuchAlgorithmException e) { 
     Log.e("CE",e.getMessage()); 
    } catch (NoSuchPaddingException e) { 
     Log.e("CE",e.getMessage()); 
    } catch (InvalidKeyException e) { 
     Log.e("CE",e.getMessage()); 
    } catch (IllegalBlockSizeException e) { 
     Log.e("CE",e.getMessage()); 
    } catch (BadPaddingException e) { 
     Log.e("CE",e.getMessage()); 
} 
+0

질문을 다시 읽었으며 ZeroBytePadding이 원하는 것이 아닐 것이라고 생각합니다. ANSI X.923이 원하는 바가 아니라면 (마지막 바이트를 암호화하지 않기 때문에), 직접 패딩 루틴을 작성해야합니다. 따라서 X.923으로 메시지를 채우고, 마지막 바이트를 복사하고 암호화 한 다음 마지막 바이트를 제로 패드 길이로 파일에 추가하십시오. – Chopstick

+3

'Cipher cipher = Cipher.getInstance ("AES/ECB/ZeroBytePadding");'yields' ' "AES/ECB/ZeroBytePadding"을 지원하는 공급자를 찾을 수 없습니다. 내가 사용해야하는 공급자가 무엇인지 알고 있습니까? –

+0

@OneTwoThree ZeroBytePadding은 Bouncy Castle 코드를 기반으로하지만 Android에서는 작동하지 않지만 JRE에서는 작동하지 않습니다. 사용할 수없는 경우 Bouncy Castle 제공 업체를 추가하거나 구성하거나 Spongy Castle을 사용하십시오. –