更新
我已经对C#代码进行了更改,因此它使用的块大小为256。但是现在,您好世界看起来像这样http://pastebin.com/5sXhMV11,我无法弄清楚应该使用rtrim()获得什么一团糟的最后。
另外,当您说IV应该是随机的时,您的意思是不要再使用一次相同的IV,否则我编码的方式错误吗?
再次感谢!
你好
我正在尝试使用在C#中加密的PHP解密字符串。我似乎无法让PHP使用mcrypt对其进行解密,请提供一些帮助。我在php中收到以下错误,所以我猜我没有正确设置IV。
错误:IV参数必须与块大小一样长
两种功能使用相同的密码,密钥,IV并设置为CBC模式:
来自c#的加密文本= UmzUCnAzThH0nMkIuMisqg ==
密钥32长= qwertyuiopasdfghjklzxcvbnmqwerty
iv 16长= 1234567890123456
C#
public static string EncryptString(string message, string KeyString, string IVString)
{
byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString);
byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString);
string encrypted = null;
RijndaelManaged rj = new RijndaelManaged();
rj.Key = Key;
rj.IV = IV;
rj.Mode = CipherMode.CBC;
try
{
MemoryStream ms = new MemoryStream();
using (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write))
{
using (StreamWriter sw = new StreamWriter(cs))
{
sw.Write(message);
sw.Close();
}
cs.Close();
}
byte[] encoded = ms.ToArray();
encrypted = Convert.ToBase64String(encoded);
ms.Close();
}
catch (CryptographicException e)
{
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
return null;
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("A file error occurred: {0}", e.Message);
return null;
}
catch (Exception e)
{
Console.WriteLine("An error occurred: {0}", e.Message);
}
finally
{
rj.Clear();
}
return encrypted;
}
的PHP
var $mcrypt_cipher = MCRYPT_RIJNDAEL_256;
var $mcrypt_mode = MCRYPT_MODE_CBC;
function decrypt($key, $iv, $encrypted)
{
$encrypted = base64_decode($encrypted);
$decrypted = rtrim(mcrypt_decrypt($this->mcrypt_cipher, $key, $encrypted, $this->mcrypt_mode, $iv), "\0");;
return $decrypted;
}
谢谢
如果要在C#应用程序中使用Rijndael256,则必须将BlockSize设置为256。
RijndaelManaged rj = new RijndaelManaged();
rj.BlockSize = 256;
然后,您的iv也必须为256位长。
请参见SymmetricAlgorithm.BlockSize属性
或相反:当前,您的C#应用程序使用Rijndael128,因此您的php脚本也必须使用。
<?php
class Foo {
protected $mcrypt_cipher = MCRYPT_RIJNDAEL_128;
protected $mcrypt_mode = MCRYPT_MODE_CBC;
public function decrypt($key, $iv, $encrypted)
{
$iv_utf = mb_convert_encoding($iv, 'UTF-8');
return mcrypt_decrypt($this->mcrypt_cipher, $key, base64_decode($encrypted), $this->mcrypt_mode, $iv_utf);
}
}
$encrypted = "UmzUCnAzThH0nMkIuMisqg==";
$key = "qwertyuiopasdfghjklzxcvbnmqwerty";
$iv = "1234567890123456";
$foo = new Foo;
echo $foo->decrypt($key, $iv, $encrypted);
版画 hello world
问题内容: 我已经编写了服务器,并在中编写了客户端。他们的工作是将秘密消息从服务器发送到客户端,并使用进行加密。我正在使用库,也就是说,我使用私钥初始化对象,并使用加密消息。然后,我将此加密的消息发送到服务器,并尝试使用库 使用相同的私钥对其 进行 解密。问题是它无法正确解密。它总是输出128位长的消息,其中秘密消息被随机放置在其中,通常应返回just 。 问题答案: 问题是关于填充。Python
null 下面是我当前的代码: 以下是我的结果: 原文: 正如您所看到的,加密中缺少几个字符,这也影响了解密。缺的是2号线的v和3号线的v 你知道为什么吗?
我正在使用Objective c(iPad端)和c#(.NET,服务器站点)之间的加密/解密。我使用的是以下链接中的代码:iPhone/C#AES加密 我们在服务器端加密一个XML并使用web服务将其发送到iPad端。在iPad端,当我尝试解密时,它正在创建解密数据,但无法将该数据转换为字符串。使用NSUTF8StringEncoding将数据转换为字符串时会遇到一些问题。 谢谢你!
我必须从一个用C#编写的外部现有webservice请求数据。此web服务要求加密一些数据(连接使用SSL连接,一些数据是aes加密的) 在php站点上,openssl用于解密。 c# 站点上使用以下设置(这是 AesCrypto 服务提供程序的默认值): < li >算法:AES < li >填充:PKCS7 < li >模式:CBC < li>Keysize: 256 PKCS7的填充工作如下
问题内容: 我一直在寻找在PHP服务器和Java客户端之间加密数据的方法。单独地,代码工作正常,我想在PHP服务器上坚持使用OpenSSL。 在尝试解码PHP加密字符串时遇到错误时,您是否看到了我所缺少的任何内容: PHP: PHP输出: 加密之前:Hello World !!! 在Base64之前:SGVsbG8gV29ybGQhISE = 加密镜头:44 加密的b64:U21yMVRGQTdR
我试图用C#加密一些(cookie)数据,然后用PHP解密。我选择使用Rijndael加密。我几乎让它工作,除了只有一部分的文本被解密!我从这个例子开始工作:用C#解密PHP加密的字符串 这是我正在加密的文本(JSON)(删除敏感信息): 所以我登录到 C# 应用程序,该应用程序从存储的密钥和 IV 创建/编码 cookie,然后重定向到应该解密/读取 cookie 的 PHP 应用程序。当我解密