记一次 C# aes 加密转 php

记录一次 C# 转 PHP 中遇到的一个问题。

描述:aes-128-cbc 的 c# 转 php

c# 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Security.Cryptography;
using System.Text;

namespace Rextester {
class Program {
public static string EncryptAES (string key, string content) {
// 关键代码
using (var aes = new RijndaelManaged ()) {
aes.BlockSize = 128;
aes.IV = iv;
aes.Key = key;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
var cryptoTransform = aes.CreateEncryptor ();
var resultArray = cryptoTransform.TransformFinalBlock (content, 0, content.Length);
aes.Clear ();
return Convert.ToBase64String (result, 0, result.Length);
}
}
public static void Main (string[] args) {
Console.Write (EncryptAES ("abcd", "1234"));
Console.Read ();
}
}
}

PHP 代码

1
2
3
4
5
6
7
function myEncrypt($key, $content){
// AES-128-CBC AES-192-CBC AES-256-CBC
return base64_encode(openssl_encrypt($content,'AES-128-CBC', base64_encode(md5($key,true)), OPENSSL_RAW_DATA, $iv));
}


myEncrypt('abcd', 'efg');

注意点说明

  1. OPENSSL_RAW_DATA 对应的是 PKCS7

  2. AES-128-CBC 两个语言处理不一致

  • 对于 PHP 而言,因为所使用的是 aes-128-cbc,所以 key length 需要是 128bits 才行。所以 php 会自动截取 $key,即 substr($key, 0, 16);
  • 对于刚才的 C# 而言,可不一样了,如果 key length 大于 128bits,他会自动填充0,最后变为 aes-cbc-192,此时,php对应的方法也要改。