- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
(前言:我是加密和安全方面的新手,认为这是一种有趣的学习方式)
我正在用 C# 构建一个程序,该程序使用标准 HTTP 协议(protocol)与用 PHP 编写的服务器进行通信。我希望这两个程序都能够发送和接收加密数据。然而,尽管它们都使用相同类型的函数,但似乎在处理加密方面存在不一致。
两个程序都在 CBC 模式下使用 Rjindael 128 位。
为了演示/测试,我制作了两个几乎相同的函数,每个函数都采用相同的字符串,对其进行加密,然后将结果作为 base64 字符串输出。
PHP 函数:
public static function EncryptionTest () {
echo 'Testing Encryption to base64 string...<br/>';
$originalString = 'This is the original String! How cool is that?';
$key = "abcdefghijklmnopqrstuvwxyz012345";
$iv = "1234567890123456";
$encrypted = mcrypt_encrypt (MCRYPT_RIJNDAEL_128, $key, $originalString, MCRYPT_MODE_CBC, $iv);
echo base64_encode ($encrypted);
}
它是 C# 的对应物:
public static void EncryptionTest ()
{
System.Console.WriteLine ("Testing Encryption to base64 string...");
string originalString = "This is the original String! How cool is that?";
byte [] encryptedData;
byte [] key = System.Text.ASCIIEncoding.UTF8.GetBytes ("abcdefghijklmnopqrstuvwxyz012345");
byte [] iv = System.Text.ASCIIEncoding.UTF8.GetBytes ("1234567890123456");
RijndaelManaged cryptor = new RijndaelManaged ();
cryptor.Key = key;
cryptor.IV = iv;
cryptor.BlockSize = 128;
cryptor.Mode = CipherMode.CBC;
ICryptoTransform encryptor = cryptor.CreateEncryptor (cryptor.Key, cryptor.IV);
using (MemoryStream msEncrypt = new MemoryStream ())
{
using (CryptoStream csEncrypt = new CryptoStream (msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter (csEncrypt) )
{
swEncrypt.Write (originalString);
}
encryptedData = msEncrypt.ToArray ();
}
}
System.Console.WriteLine (System.Convert.ToBase64String (encryptedData) );
}
现在,这是 PHP 结果:
Testing Encryption to base64 string... yzwIdowhLj+cMOFPMuHSA80pWQ6R8yfFQlEsLx5kIzUOJdFykLjsaKfK4VfaBGRv
C# 结果:
Testing Encryption to base64 string... yzwIdowhLj+cMOFPMuHSA80pWQ6R8yfFQlEsLx5kIzUg74mGEQf9iW+OQ68m6cpp
如您所见,这两个结果显然已加密(好),字符数相同(好),但不同(可能不好)。
我编写了解密测试,获取这些字符串并对其进行处理。这是 PHP 函数:
public static function DecryptionTest () {
$phpBase64 = 'yzwIdowhLj+cMOFPMuHSA80pWQ6R8yfFQlEsLx5kIzUOJdFykLjsaKfK4VfaBGRv';
$csBase64 = 'yzwIdowhLj+cMOFPMuHSA80pWQ6R8yfFQlEsLx5kIzUg74mGEQf9iW+OQ68m6cpp';
$key = "abcdefghijklmnopqrstuvwxyz012345";
$iv = "1234567890123456";
$phpEncrypted = base64_decode ($phpBase64);
$phpDecrypted = mcrypt_decrypt (MCRYPT_RIJNDAEL_128, $key, $phpEncrypted, MCRYPT_MODE_CBC, $iv);
$csEncrypted = base64_decode ($csBase64);
$csDecrypted = mcrypt_decrypt (MCRYPT_RIJNDAEL_128, $key, $csEncrypted, MCRYPT_MODE_CBC, $iv);
echo 'Decrypted PHP string: "' . $phpDecrypted . '"<br/>' .
'Decrypted CS string: "' . $csDecrypted . '"';
}
和 C# 版本:
public static void DecryptionTest ()
{
System.Console.WriteLine ("Testing Decryption for PHP and CS generated base64 strings!");
string phpBase64 = "yzwIdowhLj+cMOFPMuHSA80pWQ6R8yfFQlEsLx5kIzUOJdFykLjsaKfK4VfaBGRv";
string csBase64 = "yzwIdowhLj+cMOFPMuHSA80pWQ6R8yfFQlEsLx5kIzUg74mGEQf9iW+OQ68m6cpp";
byte [] phpEncrypted = System.Convert.FromBase64String (phpBase64);
byte [] csEncrypted = System.Convert.FromBase64String (csBase64);
string phpDecrypted;
string csDecrypted;
byte [] encryptedData;
byte [] key = System.Text.ASCIIEncoding.UTF8.GetBytes ("abcdefghijklmnopqrstuvwxyz012345");
byte [] iv = System.Text.ASCIIEncoding.UTF8.GetBytes ("1234567890123456");
RijndaelManaged cryptor = new RijndaelManaged ();
cryptor.Key = key;
cryptor.IV = iv;
cryptor.BlockSize = 128;
cryptor.Mode = CipherMode.CBC;
ICryptoTransform decryptor = cryptor.CreateDecryptor (cryptor.Key, cryptor.IV);
using (MemoryStream msDecrypt = new MemoryStream (csEncrypted))
{
using (CryptoStream csDecrypt = new CryptoStream (msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader swDecrypt = new StreamReader (csDecrypt) )
{
csDecrypted = swDecrypt.ReadToEnd ();
}
}
}
System.Console.WriteLine ("Decrypted CS string: \"" + csDecrypted + "\"");
using (MemoryStream msDecrypt = new MemoryStream (phpEncrypted))
{
using (CryptoStream csDecrypt = new CryptoStream (msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader swDecrypt = new StreamReader (csDecrypt) )
{
phpDecrypted = swDecrypt.ReadToEnd ();
}
}
}
System.Console.WriteLine ("Decrypted PHP string: \"" + phpDecrypted + "\"");
}
PHP 结果:
Decrypted PHP string: "This is the original String! How cool is that?"
Decrypted CS string: "This is the original String! How cool is that?"
C# 结果:
Decrypted CS string: "This is the original String! How cool is that?"
CryptographicException: Bad PKCS7 padding. Invalid length 0. at Mono.Security.Cryptography.SymmetricTransform.ThrowBadPaddingException (PaddingMode padding, Int32 length, Int32 position) [0x0005c] in > /Applications/buildAgent/work/84669f285f6a667f/mcs/class/corlib/Mono.Security.Cryptography/SymmetricTransform.cs:363
因此,基本上,PHP 代码可以成功解密两个 base64 字符串,但 C# 代码只能解密由其自己的解密器创建的 base64 字符串。
其中很多是我在互联网上找到的代码,并根据我的需要进行了修改。就像我说的,我是密码学的新手,但我已经走得很远了。我可以整天推理和测试,但它开始占用我的日程安排,所以我正在寻找其他人的见解,以了解为什么它不起作用。谢谢!
最佳答案
您需要使用 PHPSecLib因为 PHP
实现与 C++/C#
不兼容。它具有不同的填充大小(我不是这里的加密专家,但这是我经过几天的测试后发现的)。因此,使用 phpseclib
中的 native 实现,它将起作用。
我自己前段时间碰到过这个问题。但是使用 C++
/CryptoAPI
和 PHP
。
关于c# - 如何使用 PHP 加密字符串将 CSharp/.NET 设为 "play nice"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17371706/
我知道 os.nice(20) 设置了 linux 上的最大 nice 级别。 但我不知道其他 unix 的值(value)(我不关心 MS-Win)。 我可以在 python 中使用最大 nice
我在 iostat 命令的手册中搜索了关于 %nice.在explanation在 %nice 的值中,有一个关于 nice 优先级的短语。我不明白它的意思,有人可以解释一下吗? 手册页中的完整注释如
我的一个容器总是很忙,并且正在从其他需要响应且仅不时处于事件状态的容器(网络服务器)中占用 CPU。 我想降低CPU消耗容器的CPU优先级,这样每当其他容器需要CPU时,它就不会被阻塞。 我该怎么做?
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
更改调用进程优先级的函数(例如:nice())应该作为库调用还是系统调用来实现?我在网上阅读有关它的信息,据我了解,它曾经是一个系统调用,但现在是一个库调用。为什么会这样? 最佳答案 所有函数都是库调
注意:这不适用于网页,它是一个简单的程序,它包含一组图像并会随机选择一些图像并将它们显示在屏幕上。想象一下使用图像编辑器并在 Canvas 上手动定位导入的图像。 我很难想出一种在固定尺寸的屏幕(它只
我需要一个相当聪明的算法来为图形(图表)设计出“漂亮”的网格线。 例如,假设一个条形图的值为 10、30、72 和 60。您知道: 最小值:10最大值:72范围:62 第一个问题是:你从什么开始?在这
是否有与 Unix 命令等效的 Windows 命令,nice? 我专门寻找可以在命令行使用的东西,不是任务管理器中的“设置优先级”菜单。 我试图在 Google 上找到它,但遭到无法想出更好形容词的
这个问题在这里已经有了答案: is nice() used to change the thread priority or the process priority? (3 个答案) 关闭 1 年
nice 的手册页说“nice() 将 inc 添加到 calling process 的 nice 值中。那么,我们可以使用它来更改 nice 值吗? pthread_create 创建的线程? 编
我想远程制作类似于DinahMoe's "plink"的东西。在plink中,单击鼠标可播放音高与鼠标高度成比例的音符。我可以看到高度被划分为多个“条纹”,因此,当您移动鼠标时,您没有某种“滑动”的声
我正在开发一个使用 nice select 的脚本: تعداد حمام 1 حمام 2 حمام 3 حمام 4 حم
如何将 double 格式化为字符串,以便它显示所有(无限制)小数位(如果有)但不显示任何尾随 0? 最佳答案 double x = ...; DecimalFormat fmt = new Deci
我添加了一个 Plunker在这里,如果您在下拉列表中选择团队 2,域将设置为 9,而不是我期望的值,即 10。 在documentation它说明了以下有关 nice() 的内容 Extends t
如何使用带别名的“nice”命令? 举个例子: alias list=ls list # works nice -10 list # doesn't work 我怎样才能使最后一行起作用? 最佳答案
我目前正在修改我们现有的专有套接字包装器代码以使用 boost asio,以便它可以为我们完成一些繁重的工作。也许我们现有代码中最复杂的部分是多播处理代码。该代码允许我们的中间层服务器(一个系统中可以
我正在使用 hernansartorio/jquery-nice-select插件并试图让它截断长命名选项字符串。 当溢出设置为隐藏时,选择无法正常工作 - 当点击的下拉菜单不出现时。 (它出现但未显
我有一个 C++ (VS2010) 类(class)。 此类具有公共(public)函数,例如“ToString”。 有时我需要从类中调用 ToString。 例如: void::ConvertToL
最近从top的结果中,发现一个进程的nice值设置为10。看起来是内核做的,因为进程长时间占用大量cpu。 但是,据我所知,nice 值是由用户设置的,用于为进程指定静态优先级。而且我不确定内核是否会
我正在尝试将某些流程优先于其他流程。这是我正在使用的主要脚本,模拟一个 CPU 密集型进程: simple_app.py import os from multiprocessing import P
我是一名优秀的程序员,十分优秀!