java php c# 三種語言的AES加密互轉
java php c# 三種語言的AES加密互轉
資料來源:https://www.cnblogs.com/bangejingting/p/5600568.html
https://gist.github.com/resting/3421760
PHP 測試網頁: https://encode-decode.com/aes128-encrypt-online/
ECB模式,PKCS5Padding填充。注意注意注意java只支持16位的key!!!
php
<?php
function aes128Encrypt($key, $data) {
if(16 !== strlen($key)) $key = hash('MD5', $key, true);
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16)));
}
function aes128Decrypt($key, $data) {
$data = base64_decode($data);
if(16 !== strlen($key)) $key = hash('MD5', $key, true);
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16));
$padding = ord($data[strlen($data) - 1]);
return substr($data, 0, -$padding);
}
echo aes128Encrypt("00000000FF593EEB", "0501");
echo "</br>";
echo aes128Decrypt("00000000FF593EEB", aes128Encrypt("00000000FF593EEB", "0501"));
/*
輸出備份:
Y5MTre3MWDwP3Zj3+YWgEw==
0501
*/
?>
java
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class HelloWorld{
// 加密
public static String Encrypt01(String sSrc, String sKey) throws Exception {
try{
Base64.Encoder encoder = Base64.getEncoder();
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();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"
IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes());
return encoder.encodeToString(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
} catch(Exception e){
return null; // Always must return something
}
}
// 解密
public static String Decrypt01(String sSrc, String sKey) throws Exception {
Base64.Decoder decoder = Base64.getDecoder();
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("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec("0102030405060708"
.getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] encrypted1 = decoder.decode(sSrc);//先用base64解密
try {
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original);
return originalString;
} catch (Exception e) {
System.out.println(e.toString());
return null;
}
} catch (Exception ex) {
System.out.println(ex.toString());
return null;
}
}
/**
* 加密源数据
*
* @param input
* @return
*/
public static String encrypt02(String input) {
byte[] crypted = null;
Base64.Encoder encoder = Base64.getEncoder();
try {
byte[] raw = "00000000FF593EEB".getBytes();
SecretKeySpec skey = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
crypted = cipher.doFinal(input.getBytes("UTF-8"));
} catch (Exception e) {
System.out.println(e.toString());
}
return new String(encoder.encodeToString(crypted));
}
/**
* 解密源数据
*
* @param input
* @return
*/
public static String decrypt02(String input) {
Base64.Decoder decoder = Base64.getDecoder();
byte[] output = null;
try {
byte[] raw = "00000000FF593EEB".getBytes();
SecretKeySpec skey = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skey);
output = cipher.doFinal(decoder.decode(input));
} catch (Exception e) {
System.out.println(e.toString());
}
return new String(output);
}
public static void main(String []args){
System.out.println("Hello World");
try{
System.out.println(Encrypt01("0501", "00000000FF593EEB"));
System.out.println(Decrypt01(Encrypt01("0501", "00000000FF593EEB"),"00000000FF593EEB"));
System.out.println(encrypt02("0501"));
System.out.println(decrypt02(encrypt02("0501")));
}
catch(Exception e){
}
}
}
/*
線上執行: https://www.tutorialspoint.com/compile_java_online.php
Hello World
DRVBtq299GURV29UrfXOpw==
0501
Y5MTre3MWDwP3Zj3+YWgEw==
0501
*/
C#
//---
//for php aes128
//資料來源: https://www.cnblogs.com/bangejingting/p/5600568.html
//PHP 測試網頁: https://encode-decode.com/aes128-encrypt-online/
//EX: pin: AES 128加密 範例: 假設密碼為 0501 AES加密的KEY為卡號00000000FF593EEB, 加密後為Y5MTre3MWDwP3Zj3+YWgEw==
//C# code
/*
String data01 = Web_encrypt.AesEncrypt("0501", "00000000FF593EEB");
String data02 = Web_encrypt.AesDecrypt(data01, "00000000FF593EEB");
*/
public static string AesEncrypt(string str, string key)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
Byte[] ivArray = new Byte[16];
System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
IV = ivArray,
Mode = System.Security.Cryptography.CipherMode.ECB,
Padding = System.Security.Cryptography.PaddingMode.PKCS7,
};
System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
public static string AesDecrypt(string str, string key)
{
if (string.IsNullOrEmpty(str)) return null;
Byte[] toEncryptArray = Convert.FromBase64String(str);
Byte[] ivArray = new Byte[16];
System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
IV = ivArray,
Mode = System.Security.Cryptography.CipherMode.ECB,
Padding = System.Security.Cryptography.PaddingMode.PKCS7
};
System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
//---for php aes128
One thought on “java php c# 三種語言的AES加密互轉”
C# 在資料這麼短的情況下 CBC 和 ECB 結果會一樣
但是隨著 資料長度變長,則結果會不同
目前 在SYRIS公司 PHP 是使用 ECB
所以特此紀錄