在C#和PHP中等于加密/解密AES ECB

时间:2014-08-14 12:53:29

标签: c# php cryptography aes

任何人都可以帮助我使用PHP加密的解密数据(C#)吗?

在PHP中使用函数:

public function encryptString($str) {
    $block = mcrypt_get_block_size('rijndael_128', 'ecb');
    $pad = $block - (strlen($str) % $block);
    $str .= str_repeat(chr($pad), $pad);

    $res = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->key, $str, MCRYPT_MODE_ECB);

    return $res;
}

同样在Java中我使用:

public byte[] encryptBytes(byte[] source) {
        try {
            byte[] raw = key.getBytes(Charset.forName("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

            byte[] encrypted = cipher.doFinal(source);

            return encrypted;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

我的C#代码:

public string encryptString(string data, string key) 
{
    byte[] keyArray = Encoding.UTF8.GetBytes(key);
    byte[] toEncryptArray = Encoding.UTF8.GetBytes(data);
    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 Encoding.UTF8.GetString(resultArray);
}

键 - 32个字符的字符串。

我无法在C#中正确解密加密数据。

1 个答案:

答案 0 :(得分:0)

你C#正在使用字符串而不是字节数组。这不同于例如你的Java代码。然而

return Encoding.UTF8.GetString(resultArray);
当密文包含对UTF-8无效编码的字节时,

将丢失数据。

此外,我建议您在C#代码中使用CryptoStream; .NET加密库似乎以流式方法为中心(无论好坏)。