Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么使用DPAPI加密时会得到不同的输出? 我在C++中使用DPAPI加密一些需要存储在文件中的数据。问题是我需要从C#读取该文件,因此我需要能够: C++加密,C++解密(工作良好)< /P>_C#_C++_Encryption_Dpapi - Fatal编程技术网

为什么使用DPAPI加密时会得到不同的输出? 我在C++中使用DPAPI加密一些需要存储在文件中的数据。问题是我需要从C#读取该文件,因此我需要能够: C++加密,C++解密(工作良好)< /P>

为什么使用DPAPI加密时会得到不同的输出? 我在C++中使用DPAPI加密一些需要存储在文件中的数据。问题是我需要从C#读取该文件,因此我需要能够: C++加密,C++解密(工作良好)< /P>,c#,c++,encryption,dpapi,C#,C++,Encryption,Dpapi,C加密,C解密(工作正常) C++加密、C#解密,反之亦然(不工作) 在C#中,我使用DllImport对CryptProtectData和cryptpunprotectdata方法进行pInvoke,并按照说明实现它们。我知道,在C#中,我可以使用ProtectedData类中包含的方法,但我采用这种方式(使用DllImport)来确保两个代码(C++和C#)的外观和工作方式几乎相同 现在奇怪的是,即使两个代码看起来相同,我也会得到不同的输出,例如,对于以下文本: “纯文本” 在C++中得到:

C加密,C解密(工作正常)

C++加密、C#解密,反之亦然(不工作)

在C#中,我使用DllImport对CryptProtectData和cryptpunprotectdata方法进行pInvoke,并按照说明实现它们。我知道,在C#中,我可以使用ProtectedData类中包含的方法,但我采用这种方式(使用DllImport)来确保两个代码(C++和C#)的外观和工作方式几乎相同

现在奇怪的是,即使两个代码看起来相同,我也会得到不同的输出,例如,对于以下文本:

“纯文本”

在C++中得到:

01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0033 9F 55 49 94 26 54 2B C8 CB 70 7B FE EC 96 14 00 00 00 C5 23 DA BA C8 23 6C 0B B3 88 69 06 00 95 29 AE 76 A7 63 E4

在C#中,我得到:

01 00 00 00 D0 8C 9D DF 01 15 D1 11 8C 7A 00 C0 4F C2 97 EB 01 00 00 00 2E 6F 88 E6 16 9B 4F 9B 35 DA 9F C6 EC 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 66 00 00 00 00 00 A8 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 34 C4 40 CD 91 EC 66 E9 23 F7 9E 04 9C 83 00 00 00 00 00 04 80 00 00 00 00 00 00 00 00 10 00 00 00 00 12 1E 26 72 26 26 0A D1 11 1D EF 13 1D B2 10 00 00 00 00 00 00 00 819D 46 37 D1 68 5D 17 B8 23 78 48 18 ED 06 ED 14 00 00 00 E4 45 07 1C 08 55 99 80 A4 59 D9 33 BC 0B 71 35 39 05 C4 BB

正如你所看到的,第一个角色是相同的,但其余的都是不同的,所以如果有人知道为什么会发生这种情况,我将感谢你的帮助

谢谢

C++中的代码:


value = "plain text";
DATA_BLOB DataIn;
DATA_BLOB DataOut;

BYTE *pbDataInput =(BYTE *)(char*)value.c_str();
DWORD cbDataInput = strlen((char *)pbDataInput)+1;
DataIn.pbData = pbDataInput; 
DataIn.cbData = cbDataInput;

CryptProtectData(&DataIn, NULL, NULL, NULL, NULL, 0, &DataOut))
C#中的代码:


(你可以看到我的C代码看起来如何,因为与微软例子中的代码相同)

如果你可以发布C++和C代码,这会有帮助。可能存在一些细微的参数差异或类似的情况。例如,您应该确保poputionalEntropy参数相同(或者将其设置为NULL以测试这是否是错误源)。此外,请确保尝试在同一台电脑上加密和解密:

[…]解密通常只能在 存放数据的计算机 加密的

(来源:)

编辑:对您发布的代码和MSDN的C版本的一些评论(部分内容如下):

并且这里是您的C++代码,再次使视图中既有:

[...]
BYTE *pbDataInput =(BYTE *)(char*)value.c_str();
DWORD cbDataInput = strlen((char *)pbDataInput)+1;
[...]
CryptProtectData(&DataIn, NULL, NULL, NULL, NULL, 0, &DataOut))
参数不匹配,我认为这是差异的根源

首先是旗帜。C代码使用dwFlags!=0,C++代码使用DWFLAGS=0,所以这显然是不同的。 我不确定熵。如果你没有通过optoalCalpal= NULL,那就有区别了,但是如果它是NULL,那么就有一个“新字节[0 ]”赋值,我不确定它会产生什么,但是我认为你至少应该尝试将ItpTr.0而不是EntPyBuLB传递给CuftPrtucDATA数据,以与C++代码匹配。

最后,但并非最不重要的,你的C++代码包含了限定C字符串的尾部NUL,我不知道这里使用的加密是如何工作的,但是如果一个字节不同(或者在这种情况下你有一个字节类似),那么加密会给你带来非常不同的输出,所以你应该在C代码中包含一个终止NUL或者在C++代码中删除它。< /P>一些格式化的HEX编辑器,比如数据示例,而不是那些截图。这是很好的。不能做截图。@牛顿:你可以打开一个单独的标签来链接图形,以便更好地查看它(在Firefox)的“显示图形”中也可以看到。@schnaader-谢谢,不是因为有很多东西可看!每次使用不同IV的块链接加密将为相同数据创建不同的blob。这不会让我感到惊讶。

[...]
BYTE *pbDataInput =(BYTE *)(char*)value.c_str();
DWORD cbDataInput = strlen((char *)pbDataInput)+1;
[...]
CryptProtectData(&DataIn, NULL, NULL, NULL, NULL, 0, &DataOut))