java.. C# 使用AES加密互解 采用AES-128-ECB加密模式
阿新 • • 發佈:2018-02-24
convert odi summary for number als name apache base java需要下載外部包, commons codec.jar 1.6 較新的JAVA版本把Base64的方法改成靜態方法,可能會寫成
Base64.encodeToString(encrypted, 0);
Base64.encodeToString(encrypted, 0);
import
javax.crypto.Cipher;
import
javax.crypto.spec.SecretKeySpec;
import
org.apache.commons.codec.binary.Base64;
/**
*
* @author Administrator
*
*/
public
class
AES {
// 加密
public
static
String Encrypt(String sSrc, String sKey)
throws
Exception {
if
(sKey ==
null
) {
System.out.print(
"Key為空null"
);
return
null
;
}
// 判斷Key是否為16位
if
(sKey.length() !=
16
) {
System.out.print(
"Key長度不是16位"
);
return
null
;
}
byte
[] raw = sKey.getBytes(
"utf-8"
);
SecretKeySpec skeySpec =
new
SecretKeySpec(raw,
"AES"
);
Cipher cipher = Cipher.getInstance(
"AES/ECB/PKCS5Padding"
);
//"算法/模式/補碼方式"
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte
[] encrypted = cipher.doFinal(sSrc.getBytes(
"utf-8"
));
return
new
Base64().encodeToString(encrypted);
//此處使用BASE64做轉碼功能,同時能起到2次加密的作用。
}
// 解密
public
static
String Decrypt(String sSrc, String sKey)
throws
Exception {
try
{
// 判斷Key是否正確
if
(sKey ==
null
) {
System.out.print(
"Key為空null"
);
return
null
;
}
// 判斷Key是否為16位
if
(sKey.length() !=
16
) {
System.out.print(
"Key長度不是16位"
);
return
null
;
}
byte
[] raw = sKey.getBytes(
"utf-8"
);
SecretKeySpec skeySpec =
new
SecretKeySpec(raw,
"AES"
);
Cipher cipher = Cipher.getInstance(
"AES/ECB/PKCS5Padding"
);
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte
[] encrypted1 =
new
Base64().decode(sSrc);
//先用base64解密
try
{
byte
[] original = cipher.doFinal(encrypted1);
String originalString =
new
String(original,
"utf-8"
);
return
originalString;
}
catch
(Exception e) {
System.out.println(e.toString());
return
null
;
}
}
catch
(Exception ex) {
System.out.println(ex.toString());
return
null
;
}
}
public
static
void
main(String[] args)
throws
Exception {
/*
* 此處使用AES-128-ECB加密模式,key需要為16位。
*/
String cKey =
"1234567890123456"
;
// 需要加密的字串
String cSrc =
"www.gowhere.so"
;
System.out.println(cSrc);
// 加密
String enString = AES.Encrypt(cSrc, cKey);
System.out.println(
"加密後的字串是:"
+ enString);
// 解密
String DeString = AES.Decrypt(enString, cKey);
System.out.println(
"解密後的字串是:"
+ DeString);
}
}
C#
/// <summary>
/// 有密碼的AES加密
/// </summary>
/// <param name="text">加密字符</param>
/// <param name="password">加密的密碼</param>
/// <param name="iv">密鑰</param>
/// <returns></returns>
public
static
string
Encrypt(
string
toEncrypt,
string
key)
{
byte
[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte
[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
RijndaelManaged rDel =
new
RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte
[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return
Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="text"></param>
/// <param name="password"></param>
/// <param name="iv"></param>
/// <returns></returns>
public
static
string
Decrypt(
string
toDecrypt,
string
key)
{
byte
[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte
[] toEncryptArray = Convert.FromBase64String(toDecrypt);
RijndaelManaged rDel =
new
RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte
[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return
UTF8Encoding.UTF8.GetString(resultArray);
}
java.. C# 使用AES加密互解 采用AES-128-ECB加密模式