Чтобы использовать AES с 256 битами во встроенном Java 1.4 API - PullRequest
0 голосов
/ 20 января 2010

Я могу зашифровать с помощью AES 128, но с большей длиной ключа это не удается.

код с использованием AES 128 приведен ниже.

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;

/ ** * Эта программа генерирует ключ AES, извлекает его необработанные байты и * затем восстанавливает ключ AES из байтов ключа. * Восстановленный ключ используется для инициализации шифра AES для * шифрование и дешифрование. * /

public class AES {

 /**
 * Turns array of bytes into string
 *
 * @param buf   Array of bytes to convert to hex string
 * @return  Generated hex string
 */
 public static String asHex (byte buf[]) {
  StringBuffer strbuf = new StringBuffer(buf.length * 2);
  int i;

  for (i = 0; i < buf.length; i++) {
   if (((int) buf[i] & 0xff) < 0x10)
    strbuf.append("0");

   strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
  }

  return strbuf.toString();
 }

 public static void main(String[] args) throws Exception {

   String message="This is just an example";

   // 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();

   SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");


   // Instantiate the cipher

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

   cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

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

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

Ответы [ 2 ]

3 голосов
/ 20 января 2010

Возможно, вам просто нужно обновить / изменить версию Java. Некоторые версии Java поставляются предварительно упакованными без 192/256-битного шифрования AES из-за законов об экспорте крипто-продуктов из США.

Тем не менее, 128 битов здесь достаточно для большинства случаев. Кроме того, вместо использования этого кода непосредственно изучите использование библиотек более высокого уровня, таких как Keyczar . По ряду причин (например, кодировка ECB) приведенный выше код небезопасен, я бы ему не поверил.

2 голосов
/ 20 января 2010

Java 1.4 поставляется с файлом политики Strong JCE. Вам необходимо установить политику Unlimited Strength, чтобы длина ключа AES превышала 128.

Смотрите это,

http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html

...