我正在開發一個安全文件傳輸項目,它使用客戶端的c#客戶端加密文件。我需要解密服務器端使用PHP和也許phpseclib文件。這裏的代碼我從一個MSDN例子複製。但我無法解決php中的解密功能。用AES加密C#文件,用phpseclib解密
public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
{
byte[] encryptedBytes = null;
byte[] saltBytes = passwordBytes;
using (MemoryStream ms = new MemoryStream())
{
using (RijndaelManaged AES = new RijndaelManaged())
{
var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
AES.KeySize = 256;
AES.BlockSize = 256;
AES.Mode = CipherMode.CBC;
AES.Padding = PaddingMode.Zeros;
AES.Key = key.GetBytes(AES.KeySize/8);
AES.IV = key.GetBytes(AES.BlockSize/8);
using (CryptoStream cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
cs.Close();
}
encryptedBytes = ms.ToArray();
}
}
return encryptedBytes;
}
這是PHP代碼不工作:
$pw = "this_is_my_pw";
$aes = new Crypt_AES(CRYPT_AES_MODE_CBC);
$aes->setKey($pw);
$aes->setKeyLength(256);
$aes->disablePadding();
$file = "enc.txt";
$fh = fopen($file, "r");
$contents = trim(fread($fh, filesize($file)));
fclose($fh);
//echo "Encoded: \n\n" . $contents;
$contents = $aes->decrypt($contents);
#$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
#$padding = $block - (strlen($clear) % $block);
#$dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $pw, base64_decode($contents), MCRYPT_MODE_CBC, $pw);
echo "Decoded: \n\n" . $contents;
有人可以幫助我解決這個或者給我一個提示我做錯了什麼?
使用不是精確支持長度的加密密鑰取決於非標準密鑰填充,這不是一個好主意,並且可能導致互操作性困難。使用文本作爲關鍵還會降低安全性。在這種情況下,密碼代表少於86位的密鑰材料。 – zaph
@ zaph - 抓住關鍵尺寸 - 我沒有看到它。我剛剛注意到有關塊大小的一點,有點大笑起來,大聲笑 – neubert
答案是Rijndael('setBlockLength(256)')不是AES,Rijndael允許128,160,192,224或256的密鑰和塊大小每個比特。 – zaph