javaaes128加密
使用AES加密時,當密鑰大於128時,代碼會拋出java.security.InvalidKeyException: Illegal key size or default parameters
Illegal key size or default parameters是指密鑰長度是受限制的,java運行時環境讀到的是受限的policy文件。文件位於${java_home}/jre/lib/security
這種限制是因為美國對軟體出口的控制。
解決辦法:
去掉這種限制需要下載Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files.網址如下。
下載包的readme.txt 有安裝說明。就是替換${java_home}/jre/lib/security/ 下面的local_policy.jar和US_export_policy.jar
jdk 5: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jce_policy-1.5.0-oth-JPR
❷ 通過Java如何實現AES密碼演算法
1. AES加密字元串
public static byte[] encrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");// 創建AES的Key生產者
kgen.init(128, new SecureRandom(password.getBytes()));// 利用用戶密碼作為隨機數初始化出
// 128位的key生產者
//加密沒關系,SecureRandom是生成安全隨機數序列,password.getBytes()是種子,只要種子相同,序列就一樣,所以解密只要有password就行
SecretKey secretKey = kgen.generateKey();// 根據用戶密碼,生成一個密鑰
byte[] enCodeFormat = secretKey.getEncoded();// 返回基本編碼格式的密鑰,如果此密鑰不支持編碼,則返回
// null。
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 轉換為AES專用密鑰
Cipher cipher = Cipher.getInstance("AES");// 創建密碼器
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化為加密模式的密碼器
byte[] result = cipher.doFinal(byteContent);// 加密
return result;
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
2. AES解密
public static byte[] decrypt(byte[] content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");// 創建AES的Key生產者
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();// 根據用戶密碼,生成一個密鑰
byte[] enCodeFormat = secretKey.getEncoded();// 返回基本編碼格式的密鑰
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 轉換為AES專用密鑰
Cipher cipher = Cipher.getInstance("AES");// 創建密碼器
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化為解密模式的密碼器
byte[] result = cipher.doFinal(content);
return result; // 明文
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
❸ java的aes加密成多少位數
深圳遠標幫你:
1.默認 Java 中僅支持 128 位密鑰,當使用 256 位密鑰的時候,會報告密鑰長度錯誤
Invalid AES key length
你需要下載一個支持更長密鑰的包。這個包叫做 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6
看一下你的 JRE 環境,將 JRE 環境中 lib\lib\security 中的同名包替換掉。
2. Base64 問題
// 編碼
String asB64 = new Base64().encodeToString("some string".getBytes("utf-8"));
System.out.println(asB64); // 輸出為: c29tZSBzdHJpbmc=
解碼
// 解碼
byte[] asBytes = new Base64().getDecoder().decode("c29tZSBzdHJpbmc=");
System.out.println(new String(asBytes, "utf-8")); // 輸出為: some string
如果你已經使用 Java 8,那麼就不需要再選用第三方的實現了,在 java.util 包中已經包含了 Base64 的處理。
編碼的方式
// 編碼
String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));
System.out.println(asB64); // 輸出為: c29tZSBzdHJpbmc=
解碼處理
// 解碼
byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");
System.out.println(new String(asBytes, "utf-8")); // 輸出為: some string
3. 關於 PKCS5 和 PKCS7 填充問題
PKCS #7 填充字元串由一個位元組序列組成,每個位元組填充該填充位元組序列的長度。
假定塊長度為 8,數據長度為 9,
數據: FF FF FF FF FF FF FF FF FF
PKCS7 填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07
簡單地說, PKCS5, PKCS7和SSL3, 以及CMS(Cryptographic Message Syntax)
有如下相同的特點:
1)填充的位元組都是一個相同的位元組
2)該位元組的值,就是要填充的位元組的個數
如果要填充8個位元組,那麼填充的位元組的值就是0×8;
要填充7個位元組,那麼填入的值就是0×7;
…
如果只填充1個位元組,那麼填入的值就是0×1;
這種填充方法也叫PKCS5, 恰好8個位元組時還要補8個位元組的0×08
正是這種即使恰好是8個位元組也需要再補充位元組的規定,可以讓解密的數據很確定無誤的移除多餘的位元組。
比如, Java中
Cipher.getInstance(「AES/CBC/PKCS5Padding」)
這個加密模式
跟C#中的
RijndaelManaged cipher = new RijndaelManaged();
cipher.KeySize = 128;
cipher.BlockSize = 128;
cipher.Mode = CipherMode.CBC;
cipher.Padding = PaddingMode.PKCS7;
的加密模式是一樣的
因為AES並沒有64位的塊, 如果採用PKCS5, 那麼實質上就是採用PKCS7
❹ 用JAVA實現了AES128加密,求用C語言解密的代碼,謝謝各位大神了!
http://blog.chen777.com/2015/10/13/Java%E4%B8%8EC-AES%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/#more
不知道適合你用嗎,我以前是用這種方式實現的。
❺ 如何把以下 java AES-128-CBC 加密方法改為 php 的實現
$key = hash('md5', $key, true);
$iv = '';
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$input = Security::pkcs5_pad($input, $size);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $input, MCRYPT_MODE_CBC, $iv);
// output wd/OTHoIXwgHGDHcj8OTgg==
echo base64_encode($encrypted);
❻ php AES加密對不上java的加密,請問如何實現
要注意特定的Padding實現跟演算法的blockSize有關,這里php的blocksize是在php的aes加密前先對源字元串進行Padding,問題得到解決。
❼ java實現aes加密或者解密,不用工具包的怎麼做
importjava.security.InvalidKeyException;
importjava.security.Key;
importjava.security.NoSuchAlgorithmException;
importjavax.crypto.*;
importjavax.crypto.spec.*;
/**
*
*@authorwchun
*
*AES128演算法,加密模式為ECB,填充模式為pkcs7(實際就是pkcs5)
*
*
*/
publicclassAES{
staticfinalStringalgorithmStr="AES/ECB/PKCS5Padding";
;
staticprivateCiphercipher;
staticbooleanisInited=false;
//初始化
staticprivatevoidinit()
{
//初始化keyGen
try{
keyGen=KeyGenerator.getInstance("AES");
}catch(NoSuchAlgorithmExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
keyGen.init(128);
//初始化cipher
try{
cipher=Cipher.getInstance(algorithmStr);
}catch(NoSuchAlgorithmExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(NoSuchPaddingExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
isInited=true;
}
publicstaticbyte[]GenKey()
{
if(!isInited)//如果沒有初始化過,則初始化
{
init();
}
returnkeyGen.generateKey().getEncoded();
}
publicstaticbyte[]Encrypt(byte[]content,byte[]keyBytes)
{
byte[]encryptedText=null;
if(!isInited)//為初始化
{
init();
}
Keykey=newSecretKeySpec(keyBytes,"AES");
try{
cipher.init(Cipher.ENCRYPT_MODE,key);
}catch(InvalidKeyExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
try{
encryptedText=cipher.doFinal(content);
}catch(IllegalBlockSizeExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(BadPaddingExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnencryptedText;
}
//解密為byte[]
publicstaticbyte[]DecryptToBytes(byte[]content,byte[]keyBytes)
{
byte[]originBytes=null;
if(!isInited)
{
init();
}
Keykey=newSecretKeySpec(keyBytes,"AES");
try{
cipher.init(Cipher.DECRYPT_MODE,key);
}catch(InvalidKeyExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
//解密
try{
originBytes=cipher.doFinal(content);
}catch(IllegalBlockSizeExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(BadPaddingExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnoriginBytes;
}
}
❽ 求一個java演算法,用128位密鑰的AES加密128位明文,得出的密文還是128位...很著急,非常感謝各位大神,求救!
/**
* 加密
*
* @param content 需要加密的內容
* @param password 加密密碼
* @return
*/
public static byte[] encrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 創建密碼器
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(byteContent);
return result; // 加密
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
❾ java加密
可以的,但是對jar包直接加密,目前只支持J2SE,還不支持J2EE。更多的還是用混編器(java obfuscator)。下面是關於HASP的介紹。
-----------------------------------------------------
針對java加密防止反編譯的解決方案
眾所周知,java開發語言提供了很方便的開發平台,開發出來的程序很容易在不同的平台上被移植,現在越來越多的人使用它來開發軟體,與.net語言並駕齊驅。
Java有它方便的一面,同時也給開發者帶來了一個不小的煩惱,就是保護程序代碼變得困難,因為java語言編譯和代碼執行的特殊性,目前,除了HASP外,還沒有一個更好的解決辦法或保護方案,但如果不採取有力的措施,則自己辛辛苦苦開發出來的程序很容易被人復制而據為己有,一般情況下,大多數的人都是用混編器(java obfuscator)來把開發出來的程序進行打亂,以想達到防止反編譯的目的,但是,這種方法在網上很容易找到相關的軟體來重新整理,那麼這個混編器工具也只能控制一些本來就沒有辦法的人,而對於稍懂工具的人幾乎是透明的,沒有任何意義。再說硬體加密鎖,大多數廠商提供的加密鎖只能進行dll的連接或簡單的api調用,只要簡單地反編譯,就很容易把api去掉,這樣加密鎖根本起不了作用,那到底是否還有更好的解決辦法呢?
現提供2種解決辦法:
1、以色列阿拉丁公司的HASP HL加密鎖提供的外殼加密工具中,有一個叫做數據加密的功能,這個功能可以很好的防止反編譯而去掉api的調用,大家知道:硬體加密鎖的保護原理就是讓加密過的軟體和硬體緊密地連接在一起,調用不會輕易地被剔除,這樣才能持久地保護您的軟體不被盜版,同時,這種方式使用起來非常簡單,很容易被程序員掌握,要對一個軟體實現保護,大約只需幾分鍾的時間就可以了,下面簡單介紹一下它的原理:
運用HASP HL的外殼工具先把java解釋器進行加密,那麼,如果要啟動這個解釋器就需要有特定的加密鎖存在,然後,再運用外殼工具中的數據加密功能把java程序(CLASS或JAR包)當作一個數據文件來進行加密處理,生成新的java程序(CLASS或JAR包),因為這個加密過程是在鎖內完成的,並採用了128位的AES演算法,這樣,加密後的java程序,無論你採用什麼樣的反編譯工具,都是無法反編譯出來的。您的軟體也只有被加密過的java解釋器並有加密鎖的情況下才能正常運行,如果沒有加密鎖,程序不能運行,從而達到真正保護您的軟體的目的。
2、HASP HL提供專門針對java外殼加密工具,直接加密jar包,防止外編譯,目前只支持J2SE,將來會進一步支持J2EE,如果情況適合則是最簡單的方法。
❿ JAVA AES加密
使用AES加密時,當密鑰大於128時,代碼會拋出java.security.InvalidKeyException: Illegal key size or default parameters
Illegal key size or default parameters是指密鑰長度是受限制的,java運行時環境讀到的是受限的policy文件。文件位於${java_home}/jre/lib/security
這種限制是因為美國對軟體出口的控制。
解決辦法:
去掉這種限制需要下載Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files.網址如下。
下載包的readme.txt 有安裝說明。就是替換${java_home}/jre/lib/security/ 下面的local_policy.jar和US_export_policy.jar
jdk 5: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jce_policy-1.5.0-oth-JPR