Skip to content

Instantly share code, notes, and snippets.

@jiavictor
Last active March 3, 2024 06:57
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save jiavictor/28c2708d5aefcb32bde511ca895e44d1 to your computer and use it in GitHub Desktop.
Save jiavictor/28c2708d5aefcb32bde511ca895e44d1 to your computer and use it in GitHub Desktop.
Simple AES-128-CBC Test
using System;
using System.Text;
using System.Security.Cryptography;
namespace AES128
{
class Program
{
private string encrypt(string clearText, string secretKey, string initVector)
{
try
{
AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider();
aesProvider.KeySize = 128;
aesProvider.BlockSize = 128;
aesProvider.Mode = CipherMode.CBC;
aesProvider.Padding = PaddingMode.PKCS7;
byte[] byteText = Encoding.UTF8.GetBytes(clearText);
byte[] byteKey = Encoding.UTF8.GetBytes(secretKey.PadRight(16, '\0'));
if(byteKey.Length > 16)
{
byte[] bytePass = new byte[16];
Buffer.BlockCopy(byteKey, 0, bytePass, 0, 16);
byteKey = bytePass;
}
byte[] byteIV = Encoding.UTF8.GetBytes(initVector.PadRight(16, '\0'));
if(byteIV.Length > 16)
{
byte[] byteInit = new byte[16];
Buffer.BlockCopy(byteIV, 0, byteInit, 0, 16);
byteIV = byteInit;
}
aesProvider.Key = byteKey;
aesProvider.IV = byteIV;
byte[] byteData = aesProvider.CreateEncryptor().TransformFinalBlock(byteText, 0, byteText.Length);
return Convert.ToBase64String(byteData);
}
catch(Exception ex)
{
return ex.Message;
}
}
private string decrypt(string data, string secretKey, string initVector)
{
try
{
AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider();
aesProvider.KeySize = 128;
aesProvider.BlockSize = 128;
aesProvider.Mode = CipherMode.CBC;
aesProvider.Padding = PaddingMode.PKCS7;
byte[] byteData = Convert.FromBase64String(data);
byte[] byteKey = Encoding.UTF8.GetBytes(secretKey.PadRight(16, '\0'));
if(byteKey.Length > 16)
{
byte[] bytePass = new byte[16];
Buffer.BlockCopy(byteKey, 0, bytePass, 0, 16);
byteKey = bytePass;
}
byte[] byteIV = Encoding.UTF8.GetBytes(initVector.PadRight(16, '\0'));
if(byteIV.Length > 16)
{
byte[] byteInit = new byte[16];
Buffer.BlockCopy(byteIV, 0, byteInit, 0, 16);
byteIV = byteInit;
}
aesProvider.Key = byteKey;
aesProvider.IV = byteIV;
byte[] byteText = aesProvider.CreateDecryptor().TransformFinalBlock(byteData, 0, byteData.Length);
return Encoding.UTF8.GetString(byteText);
}
catch(Exception ex)
{
return ex.Message;
}
}
static void Main(string[] args)
{
string clearText = "BSプレミアム20日放送";
string secretKey = "SecretKey";
string initVector = "InitVector";
string data = new AES128.Program().encrypt(clearText, secretKey, initVector);
clearText = new AES128.Program().decrypt(data, secretKey, initVector);
Console.WriteLine("Encrypted String: " + data);
Console.WriteLine(clearText);
Console.ReadLine();
}
}
}
#!/usr/bin/env python3
# coding: utf-8
import base64
from Crypto.Cipher import AES
def encrypt_aes_128(clear_text, key, iv):
key_byte = key.encode('utf-8')
key_byte = key_byte.ljust(16, "\0".encode('utf-8'))
if len(key_byte) > 16:
key_byte = key_byte[:16]
iv_byte = iv.encode('utf-8')
iv_byte = iv_byte.ljust(16, "\0".encode('utf-8'))
if len(iv_byte) > 16:
key_byte = key_byte[:16]
# PKCS#5
pad_len = 16 - len(clear_text) % 16
padding = chr(pad_len) * pad_len
clear_text += padding
cryptor = AES.new(key_byte, AES.MODE_CBC, iv_byte)
data = cryptor.encrypt(clear_text)
return base64.b64encode(data).decode('utf-8')
def decrypt_aes_128(data, key, iv):
data_byte = base64.b64decode(data.encode('utf-8'))
key_byte = key.encode('utf-8')
key_byte = key_byte.ljust(16, "\0".encode('utf-8'))
if len(key_byte) > 16:
key_byte = key_byte[:16]
iv_byte = iv.encode('utf-8')
iv_byte = iv_byte.ljust(16, "\0".encode('utf-8'))
if len(iv_byte) > 16:
key_byte = key_byte[:16]
cryptor = AES.new(key_byte, AES.MODE_CBC, iv_byte)
c_text = cryptor.decrypt(data_byte)
# PKCS#5
pad_len = ord(c_text.decode('utf-8')[-1])
clear_text = c_text.decode('utf-8')[:-pad_len]
return clear_text
def main():
clear_text = "BSプレミアム20日放送"
key = "SecretKey"
iv = "InitVector"
data = encrypt_aes_128(clear_text, key, iv)
print("Encrypted String: " + data)
print(decrypt_aes_128(data, key, iv))
if __name__ == "__main__":
main()
echo -n "BSプレミアム20日放送" | openssl enc -e -aes-128-cbc -K "5365637265744B657900000000000000" -iv "496E6974566563746F72000000000000" -nosalt -a
echo "zM+I3ulxLl4Pna0FgwGKZcQHXCBcO1hzTtKmf2n36vk=" | openssl enc -d -aes-128-cbc -K "5365637265744B657900000000000000" -iv "496E6974566563746F72000000000000" -nosalt -a
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
// import javax.xml.bind.DatatypeConverter;
public class AES128Test {
private String encrypt(String clearText, String secretKey, String initVector) {
try {
byte[] bytePass = secretKey.getBytes("utf-8");
byte[] byteV = initVector.getBytes("utf-8");
byte[] byteKey = Arrays.copyOf(bytePass, 16);
byte[] byteIV = Arrays.copyOf(byteV, 16);
// System.out.println(DatatypeConverter.printHexBinary(byteKey));
// System.out.println(DatatypeConverter.printHexBinary(byteIV));
SecretKeySpec skeySpec = new SecretKeySpec(byteKey, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(byteIV);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
byte[] byteText = clearText.getBytes("utf-8");
byte[] buf = cipher.doFinal(byteText);
byte[] byteBase64 = Base64.getEncoder().encode(buf);
String data = new String(byteBase64);
return data;
}
catch(Exception ex) {
return ex.getMessage();
}
}
private String decrypt(String data, String secretKey, String initVector) {
try {
byte[] byteData = Base64.getDecoder().decode(data.getBytes("utf-8"));
byte[] bytePass = secretKey.getBytes("utf-8");
byte[] byteV = initVector.getBytes("utf-8");
byte[] byteKey = Arrays.copyOf(bytePass, 16);
byte[] byteIV = Arrays.copyOf(byteV, 16);
SecretKeySpec skeySpec = new SecretKeySpec(byteKey, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(byteIV);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
byte[] byteText = cipher.doFinal(byteData);
String clearText = new String(byteText);
return clearText;
}
catch(Exception ex) {
return ex.getMessage();
}
}
public static void main(String[] args) {
String clearText = "BSプレミアム20日放送";
String secretKey = "SecretKey";
String initVector = "InitVector";
String data = new AES128Test().encrypt(clearText, secretKey, initVector);
clearText = new AES128Test().decrypt(data, secretKey, initVector);
System.out.println("Encrypted String: " + data);
System.out.println(clearText);
}
}
<?php
function encrypt_aes128($clear_text, $key, $iv) {
$iv = str_pad($iv, 16, "\0");
$encrypt_text = openssl_encrypt($clear_text, "AES-128-CBC", $key, OPENSSL_RAW_DATA, $iv);
$data = base64_encode($encrypt_text);
return $data;
}
function decrypt_aes128($data, $key, $iv) {
$iv = str_pad($iv, 16, "\0");
$encrypt_text = base64_decode($data);
$clear_text = openssl_decrypt($encrypt_text, "AES-128-CBC", $key, OPENSSL_RAW_DATA, $iv);
return $clear_text;
}
$clear_text = "BSプレミアム20日放送";
$key = "SecretKey";
$iv = "InitVector";
$data = encrypt_aes128($clear_text, $key, $iv);
echo "Encrypted String: ".$data."\n";
echo decrypt_aes128($data, $key, $iv)."\n";
?>
@PhooPyaeSone
Copy link

When i decrypt the C# encrypted data at Php ,decrypt_aes128 always return false.Can you help me?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment