我可以使用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));
}
}
答案 0 :(得分:3)
可能只是需要升级/更改Java版本。由于有关从美国出口加密产品的法律规定,某些版本的Java预先打包而没有192/256位AES加密。
尽管如此,这里的128位对于大多数情况来说已经足够了。此外,不是直接使用此代码,而是使用更高级别的库,例如Keyczar。由于各种原因(即ECB编码),上面的代码是不安全的,我不相信它。
答案 1 :(得分:2)
Java 1.4附带一个强JCE策略文件。您需要安装Unlimited Strength策略才能使用超过128的AES密钥长度。
见这个,
http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html