SORU
10 AĞUSTOS 2010, Salı


Java AES ve kendi Anahtarını kullanarak

Bir dize kendi anahtar ile AES kullanarak şifrelemek istiyorum. Ama anahtarın bit uzunluğu ile sorun yaşıyorum. Benim kod Gözden geçirme ve değiştirme düzeltmem gereken bir şey görüyor musunuz.

public static void main(String[] args) throws Exception {
    String username = "bob@google.org";
    String password = "Password1";
    String secretID = "BlahBlahBlah";
    String SALT2 = "deliciously salty";

    // Get the Key
    byte[] key = (SALT2   username   password).getBytes();
    System.out.println((SALT2   username   password).getBytes().length);

    // Need to pad key for AES
    // TODO: Best way?

    // Generate the secret key specs.
    SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");

    // Instantiate the cipher
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

    byte[] encrypted = cipher.doFinal((secrectID).getBytes());
    System.out.println("encrypted string: "   asHex(encrypted));

    cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
    byte[] original = cipher.doFinal(encrypted);
    String originalString = new String(original);
    System.out.println("Original string: "   originalString   "\nOriginal string (Hex): "   asHex(original));
}

Şu anda bir istisna olsun "Geçersiz AES anahtar uzunluğu: 86 bayt". Pad için bir anahtar gerekiyor? Nasıl yapmalıyım?

Ayrıca ECB yapmak veya CBC için her şeyi ayarlamak gerekiyor?

Teşekkürler

CEVAP
10 AĞUSTOS 2010, Salı


Anahtarınızı bir karma oluşturmak için SHA-1 ve 128 bit sonucu (16 bayt) döşeme gerekir.

Ayrıca Dizeleri bayt dizileri oluşturmak yok() getBytesplatform varsayılan Karakter seti kullanır. Bu yüzden şifre "blaöä" farklı bayt sonuçlar farklı platformlarda dizi.

byte[] key = (SALT2   username   password).getBytes("UTF-8");
MessageDigest sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16); // use only first 128 bit

SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");

Edit: Eğer "Java Şifreleme uzantıları (JOYCE) Sınırsız Gücü, İlke Dosyaları" Oracle download link kullanın SHA-256 karma ve kaldırmak gibi . Yargı indirmek için gereken önemli boyutları olarak 256 bit ihtiyacınız varsa ^em>Diziler.kopyasıhat. "ECB" varsayılan Şifreleme Modu ve "varsayılan doldurma.PKCS5Padding. Farklı Şifreleme Modları ve Dolgu Modu ile kullanabilirsinŞifre.getınstancedize aşağıdaki biçimi kullanarak: "Şifre/Mod/Doldurma"

AES dize CTS ve PKCS5Padding kullanarak: "/CTS/PKCS5Padding" . AES

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Phandroid

    Phandroid

    26 Ocak 2009
  • TheSalband Rai

    TheSalband R

    11 NİSAN 2011
  • Valdorsha

    Valdorsha

    8 Mayıs 2006