SORU
14 HAZİRAN 2009, Pazar


Java 256-bit AES Şifre Tabanlı Şifreleme

256-bit AES şifreleme uygulamak istiyorum, ama online bulunan tüm örnekler, bir" 256 bitlik bir anahtar oluşturmak için, ama benim kendi geçiş anahtarı kullanmak istiyorum. "KeyGenerator Nasıl kendi anahtarımı oluşturabilir miyim? Bunun dışında 256 bit doldurma denedim, ama sonra bir hata anahtarı çok uzun olduğunu söylediler. Sınırsız yetki yama yüklü, sorun değil:) var

Yani. Bu KeyGenerator bu ... gibi görünüyor

// Get the KeyGenerator
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128); // 192 and 256 bits may not be available

// Generate the secret key specs.
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();

Code taken from here

EDİT

Aslında şifre çok uzun olan 256 byte, bit, dolgu yaptım. Aşağıda bu biraz daha deneyim ben şimdi kullanıyorum herhangi bir koddur.

byte[] key = null; // TODO
byte[] input = null; // TODO
byte[] output = null;
SecretKeySpec keySpec = null;
keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
output = cipher.doFinal(input)

"Kendine yapman gereken bit: -) YAPILACAK

CEVAP
14 HAZİRAN 2009, Pazar


Paylaş password (char[]) ve salt byte[] - 8 bayt tarafından seçilen bir SecureRandom iyi bir tuz-hangi gerekmez saklı tutulması) ile alıcı bant dışı. Bu bilgilerden iyi bir anahtar türetmek için (Java 6):

/* Derive the key, given password and salt. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
/* Encrypt the message. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));

ciphertext iv mağaza. Şifre çözme, SecretKey tam olarak aynı şekilde, aynı tuz ile Şifreyi kullanarak ve yineleme parametrelerini kullanarak yeniden oluşturulur. Bu anahtar ile şifre başlatılamadıvebaşlatma vektörü mesaj saklı:

/* Decrypt the message, given derived key and initialization vector. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
String plaintext = new String(cipher.doFinal(ciphertext), "UTF-8");
System.out.println(plaintext);

Java 7 AEAD şifreleme modları için API desteği dahil, ve "" sağlayıcı OpenJDK ve Oracle dağılımları ile birlikte bu Java 8 ile başlıyor. uygular SunJCE, Bu modu, güçlü bir CBC yerine tavsiye edilir; veri bütünlüğünün yanı sıra onların gizliliğini koruyacak.


İleti java.security.InvalidKeyException "boyutu veya Varsayılan parametreleri Geçersiz anahtar" şifreleme gücü anlamına gelirsınırlı, sınırsız gücü, yargı ilkesi dosyaları doğru konumda değil. Bir İLGİLENİYORUZ, ${jdk}/jre/lib/security altında yerleştirilmelidir

Sorun açıklaması göre, politika dosyaları düzgün yüklenmemiş gibi görünüyor. Sistemleri kolayca birden çok Java çalışma zamanları olabilir; çift kontrol doğru yerde kullanıldığından emin olun.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • jat4011

    jat4011

    16 EKİM 2010
  • paulandstorm

    paulandstorm

    4 EYLÜL 2006
  • PlugResearch

    PlugResearch

    22 Mart 2006

İLGİLİ SORU / CEVAPLAR