2012-07-01 20 views
5

Tôi đang sử dụng sau đây trong một ứng dụng Android và ứng dụng java độc lập:Chỉ định đối số Cipher.getInstance()?

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception { 
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
    byte[] encrypted = cipher.doFinal(clear); 
    ... 

tôi nhận được chuỗi mã hóa khác nhau trên android vs ứng dụng java độc lập của tôi (cả hai sử dụng cùng mã và chìa khóa). Tôi nhận được cùng một ngoại lệ (javax.crypto.BadPaddingException: Blocktype không phù hợp: 0) như trong câu hỏi này:

RSA Encryption: Difference between Java and Android

Và giải pháp được đề xuất là để xác định chiến lược đệm như:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 

nhưng tôi đang sử dụng "AES", không phải "RSA" và không chắc chắn cách chỉ định phần đệm kết hợp với AES. Làm thế nào tôi sẽ xây dựng chuỗi được thông qua để Cipher.getInstance() trong trường hợp đó? Tôi đã thử tính năng này:

Cipher cipher = Cipher.getInstance("AES/PKCS1Padding"); 

nhưng có ngoại lệ về việc đó không hợp lệ.

Cảm ơn

+1

thử mật mã Cipher này = Cipher.getInstance ("AES/CBC/ISO10126Padding", "JsafeJCE"); –

+0

Blast không hoạt động: java.security.NoSuchProviderException: Không có nhà cung cấp như vậy: JsafeJCE – user291701

+3

Có vẻ như bạn đang cố gắng viết mã mã hóa bằng cách ném các bit mã ngẫu nhiên vào tường và hy vọng có gì đó dính. Bằng cách sử dụng các API cấp thấp, bạn được cho là hiểu những thứ như sự khác biệt giữa mật mã đối xứng và không đối xứng, sự khác biệt giữa các chế độ mã khối và sơ đồ đệm, IV, v.v. Bạn dường như không hiểu bất kỳ của những người. Có lẽ đó là nơi bạn nên bắt đầu. –

Trả lời

4

Câu trả lời ngắn:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

Long Answer

+0

Trong trường hợp của tôi, tôi đã gọi một cipher.update khi nó phải là cipher.doFinal. – user1811107

5

Một 'trả lời ngắn gọn, nhưng tôi tin rằng AES-GCM là an toàn hơn mà chế độ CBC và được khoảng một vài năm tuy nhiên nếu bạn muốn sử dụng trong Android, bạn sẽ cần phải bao gồm spongycastle

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); 
0

Đây là cách tôi đã làm nó:

keyGenerator.init(new 
       KeyGenParameterSpec.Builder(KEY_NAME, 
       KeyProperties.PURPOSE_ENCRYPT | 
         KeyProperties.PURPOSE_DECRYPT) 
       .setBlockModes(KeyProperties.BLOCK_MODE_CBC) 
       .setUserAuthenticationRequired(true) 
       .setEncryptionPaddings(
         KeyProperties.ENCRYPTION_PADDING_PKCS7) 
       .build()); 

cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); 
Các vấn đề liên quan