2016-03-24 71 views
0

Verileri şifrelemek için aşağıdaki kodu kullandım. Girişim 16 bayttır ve anahtar 16 bayttır ancak elde ettiğim çıktı (şifrelenmiş veri) 32 bayttır. Niye ya?Neden AES 128 şifrelemesi verileri genişletiyor?

public static byte[] encrypt(byte[] plainText, byte[] key) { 
try { 
    byte[] passwordKey128 = Arrays.copyOfRange(key, 0, 16); 
    SecretKeySpec secretKey = new SecretKeySpec(passwordKey128, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
    byte[] cipherText = cipher.doFinal(plainText); 
    // String encryptedString = Base64.getEncoder().encodeToString(cipherText); 
    return cipherText; 

Sebep ne olabilir? AES bazı veriler ekler mi? Eğer sisteminde bu kripto sağlayıcıların listesi üzerinden uygulama arama yapmak ve belirlediğinizde

"algorithm/mode/padding" or 
"algorithm" 

herhangi uygulama desteklemesi durumunda:

+0

Muhtemel iki kopyası [Dolgu uzunluğu hakkında bilgi nereye yerleştirilir?] (Http://stackoverflow.com/questions/26930911/where-to-put-information-about-padding-length) –

+0

Standartlara göre AES, 128 bitlik bir blok büyüklüğü. Başka bir deyişle, diğer blok boyutları standart değildir. Alıntı, yazılım geliştiricisinin "cipher.doFinal()" işlevinin ne yaptığını açıklamıyor. Dolayısıyla IMHO, yazılımınızın geliştiricisine gözlemlediğiniz fenomeni açıklamalarını istemek daha iyidir. –

+0

Genel öneri: ** Her zaman tam nitelikli bir Cipher dizgisi kullanın. ** 'Cipher.getInstance (" AES ");' varsayılan güvenlik sağlayıcısına bağlı olarak farklı şifrelere neden olabilir. Büyük ihtimalle "AES/ECB/PKCS5Padding" ile sonuçlanır, ancak olması gerekmez. Eğer değişirse, farklı JVM'ler arasında uyumluluk kaybedersiniz. –

cevap

2

Sen dönüşüm formunun olduğu Cipher.getInstance(transformation) yöntemiyle Cipher nesneyi elde . Modu ve dolgulamayı belirtmezseniz, hangi varsayılan modun ve dolgu malzemesinin kullanılacağına karar vermek için şifreleme sağlayıcısına kadar.

this'a göre, Örneğin, SunJCE varsayılan ayarı olarak ECB ve PKCS5Padding.

PKCS5Padding her zaman en az bir bayt ekler, blok sınırının üzerine 16 baytlık iter ve iki blok için gereksinim oluşturur.