- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的代码中实现了一个 3DES (TripleDES) 解密例程,并注意到当提供的密文与前一次迭代相同时,它永远不会生成相同的明文。这似乎是不确定的,我确定这是我做错的事情。
我尝试过 CBC(IV 归零)、ECB、处置和清算的多种组合。我似乎无法获得一致的输出。
(由于某些原因,下面“代码”和“输出”的代码格式不正确,抱歉)
代码
using System;
using System.Security.Cryptography;
using System.Threading;
namespace Test
{
class Program
{
static void Main(string[] args)
{
while (true)
{
string key = "27F66D5244FF621EAA6F6120EDEB427F";
string cipher = "C25C1D1197D31CAA87285D59A892047426D9182EC11353C051ADD6D0F072A6CB3436560B3071FC1FD11D9F7E74886742D9BEE0CFD1EA1064C213BB55278B2F12";
Console.WriteLine("clear: " + byte_array_to_hex_string(
decrypt_3des(
hex_string_to_byte_array(cipher),
hex_string_to_byte_array(key)
), true, true
));
Console.WriteLine("");
Thread.Sleep(1000);
}
}
static byte[] decrypt_3des(byte[] cipher, byte[] key)
{
if (cipher == null) return null;
if (key == null) return null;
int num_chunks = (cipher.Length) / 8;
Console.WriteLine("Entering decrypt_3des");
Console.WriteLine(" - cipher: " + byte_array_to_hex_string(cipher, true, true));
Console.WriteLine(" - key: " + byte_array_to_hex_string(key, true, true));
Console.WriteLine(" - cipher length: " + cipher.Length);
Console.WriteLine(" - key length: " + key.Length);
if ((cipher.Length % 8) != 0)
{
Console.WriteLine("cipher length not divisble by eight");
return null;
}
if ((key.Length % 8) != 0)
{
Console.WriteLine("key length not divisible by eight");
return null;
}
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = key;
tdes.Mode = CipherMode.ECB;
tdes.IV = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
tdes.Padding = PaddingMode.Zeros;
tdes.KeySize = (key.Length * 8);
ICryptoTransform ct = tdes.CreateDecryptor();
Console.WriteLine(" - IV: " + byte_array_to_hex_string(tdes.IV, true, true));
byte[] clear = new byte[(cipher.Length)];
clear = ct.TransformFinalBlock(cipher, 0, cipher.Length);
Console.WriteLine(" - clear: " + byte_array_to_hex_string(clear, true, true));
tdes.Clear();
tdes.Dispose();
ct.Dispose();
return clear;
}
public static byte[] hex_string_to_byte_array(string hex)
{
int number_chars = hex.Length;
byte[] bytes = new byte[number_chars / 2];
for (int i = 0; i < number_chars; i += 2)
{
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
}
return bytes;
}
public static string byte_array_to_hex_string(byte[] ba, bool remove_dashes, bool include_spaces)
{
string hex = BitConverter.ToString(ba);
string hex_dashes = "";
string hex_spaces = "";
if (remove_dashes)
{
hex_dashes = hex.Replace("-", "");
}
else
{
return hex;
}
int hex_char_count = 0;
if (include_spaces)
{
for (int i = (hex_dashes.Length - 1); i >= 0; i--)
{
if (hex_char_count == 0)
{
hex_spaces += hex_dashes[i];
hex_char_count++;
continue;
}
if (hex_char_count % 16 == 0)
{
hex_spaces = (hex_dashes[i] + " " + hex_spaces);
hex_char_count++;
continue;
}
hex_spaces = hex_dashes[i] + hex_spaces;
hex_char_count++;
}
return hex_spaces;
}
else
{
return hex_dashes;
}
}
}
}
输出
Entering decrypt_3des - cipher: C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0CFD1EA1064 C213BB55278B2F12 - key: 27F66D5244FF621E AA6F6120EDEB427F - cipher length: 64 - key length: 16 - IV: 10F99E2232BEC7F4 - clear: BF3CBF923E6C0E19 DBBB64E0FCBBFBB9 4CA3D68F117BE51F 0C1294CEC85470B6 6A799CC5D914F427 30D0C47BC9E6340C BD8E4C2E6E5819ED 23125066DBA83477clear: BF3CBF923E6C0E19 DBBB64E0FCBBFBB9 4CA3D68F117BE51F 0C1294CEC85470B6 6A799CC5D914F427 30D0C47BC9E6340C BD8E4C2E6E5819ED 23125066DBA83477Entering decrypt_3des - cipher: C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0CFD1EA1064 C213BB55278B2F12 - key: 27F66D5244FF621E AA6F6120EDEB427F - cipher length: 64 - key length: 16 - IV: 32B9C802333CFBB4 - clear: A878F23C3AF5E724 2ACB3458F8D68E68 9BE4F6C007F24FD2 9AF4CE98239A4F2C 5710633D88266AFD 77EF88A7B09485D9 F07C33D708832E90 77382A7A51A532C1clear: A878F23C3AF5E724 2ACB3458F8D68E68 9BE4F6C007F24FD2 9AF4CE98239A4F2C 5710633D88266AFD 77EF88A7B09485D9 F07C33D708832E90 77382A7A51A532C1Entering decrypt_3des - cipher: C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0CFD1EA1064 C213BB55278B2F12 - key: 27F66D5244FF621E AA6F6120EDEB427F - cipher length: 64 - key length: 16 - IV: 2FCB1A9F5B502E1B - clear: 80B7302520ACA111 223BF99421EFDA2C 60CABCB3C632A61C 3422552A07B582B7 E50E44E38DEDC300 DD9A6EB5CF3C0A63 E512FAC0C04D3EC5 EEC551C3E845BF80clear: 80B7302520ACA111 223BF99421EFDA2C 60CABCB3C632A61C 3422552A07B582B7 E50E44E38DEDC300 DD9A6EB5CF3C0A63 E512FAC0C04D3EC5 EEC551C3E845BF80Entering decrypt_3des - cipher: C25C1D1197D31CAA 87285D59A8920474 26D9182EC11353C0 51ADD6D0F072A6CB 3436560B3071FC1F D11D9F7E74886742 D9BEE0CFD1EA1064 C213BB55278B2F12 - key: 27F66D5244FF621E AA6F6120EDEB427F - cipher length: 64 - key length: 16 - IV: 355096FE3CA1E9A1 - clear: E4EDCDC436745A51 42FE9D0C71933080 6DFCAACE07FBCC22 0F5C9AF9082C8264 870362982FF90CA4 665E312FC1A8D264 DDBB27B73B30840E 6030D791CD849A3Dclear: E4EDCDC436745A51 42FE9D0C71933080 6DFCAACE07FBCC22 0F5C9AF9082C8264 870362982FF90CA4 665E312FC1A8D264 DDBB27B73B30840E 6030D791CD849A3D
最佳答案
设置 key 大小会导致创建新的随 secret 钥。如果您在设置 key 和 IV 之前执行此操作,您将获得一致的结果。
关于c# - 3DES 不会为同一密文的多次迭代生成一致的解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13315301/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!