2012-07-16 20 views
10

Şifrelemede neredeyse yeniyim.Şifre çözme hatası: "beklenmediğinde ayarlanmadı"

Bir bayt dizisini deşifre etmeye çalışıyorum ve IV'i sağladığımda bir istisna alıyorum: InvalidAlgorithmParameterException (hiçbir beklenmediğinde iv ayarlanmadı). İşte

benim kod ( iv boş değil 16 bayt bir dizidir ve şifreleyerek kullanılan değerlere sahiptir):

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.DECRYPT_MODE, encriptionKey,new IvParameterSpec(iv)); 

Ben IV belirtmezseniz şifre Tamam İlk degeri :

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.DECRYPT_MODE, encriptionKey); 

kullandığımı ama am sürüme karşılık gelmeyebilir JCEStreamCipher (here) bir uygulamasını buldunuz cevabını bulmaya çalışmak bana şeyi ben düzeltmesi bunu anlamak değilim kılan bazı kodu vardır tly'ait. Ben şifresini damar yolu sağlayamaz gibi

if ((ivLength != 0) && !(param instanceof ParametersWithIV)) 
    { 
     SecureRandom ivRandom = random; 

     if (ivRandom == null) 
     { 
      ivRandom = new SecureRandom(); 
     } 

     if ((opmode == Cipher.ENCRYPT_MODE) || (opmode == Cipher.WRAP_MODE)) 
     { 
      byte[] iv = new byte[ivLength]; 

      ivRandom.nextBytes(iv); 
      param = new ParametersWithIV(param, iv); 
      ivParam = (ParametersWithIV)param; 
     } 
     else 
     { 
      throw new InvalidAlgorithmParameterException("no IV set when one expected"); 
     } 
    } 

görünüyor ama bana çok fazla mantıklı değildir:

İşte kod. Herhangi bir yardım büyük ölçüde takdir edilecektir.

çok teşekkürler, richard.

+0

Üzgünüz, ama sorununuzu gerçekten anlamıyorum. Kullandığınız kodu JCEStreamCipher'in yerine iki satırdan daha iyi yayınlamanız gerekir. – Robert

+0

Diyorsunuz ki, "Şifresini çözerken bir IV sağlayamıyorum gibi görünüyor" Neden olmasın? Her zamanki yöntem IV'i şifreli metinlerin önüne yerleştirmek ve bunları birlikte iletmektir. Alıcı, mesajın geri kalanının şifresini çözmek için ilk 16 baytı IV olarak kullanır. – rossum

+0

İşte böyle yapıyorum, ama IV'e decrypter'ı sunarken istisnai bir durum var, ki bu beni şaşırtıyordu. Anahtar oluştururken bir hata oluştu (sadece cevabı gönderdim). – richardtz

cevap

13

Çözüldü.

Yanlış bir SecretKey kullanıyordum, AES için oluşturabileceğiniz değil.

Önceden vardı: Bir JCEPBEKey oluşturur

KeySpec spec = new PBEKeySpec(password.toCharArray(), encryptionKeySalt, 12345,256); 
SecretKey encriptionKey = factory.generateSecret(spec); 

.

Ben eksikti: AES için yeterli gördükleri anahtar oluşturur

Key encriptionKey = new SecretKeySpec(encriptionKey.getEncoded(), "AES"); 

.

+1

Mükemmel. Bu hata, yalnızca ofisteki 4.0.3 aygıtının eski bir sürümünde gerçekleşiyordu, ancak diğerlerinde değil. Şimdi bu platformlar boyunca çalışır. –

İlgili konular