- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经编写了加密/解密自定义长度内存缓冲区的程序。加密结束很好;但是我的解密代码在任何缓冲区位置只解密一次数据,对应于 block 条目。其他 block 的解密以 NTE_BAD_DATA 结束。
你对为什么会这样有什么建议吗?
这是我的加密代码:
void CWinRSA::FinishEncrypt(const char* pcbRawData, const size_t nDataSize, char** ppcbEcrData, size_t& rnEcrSize) const
{
if (m_hProvider == NULL)
{
throw ("Cannot encrypt data with wrong provider!!");
}
if (m_hKey == NULL)
{
throw ("Cannot encrypt data with a wrong key!!");
}
size_t nBlockLength = GetBlockLength();
size_t nPaddingSize = nBlockLength - 11;
size_t nRemain = nDataSize % nBlockLength;
size_t nBlockProcess = (nDataSize / nPaddingSize + (nRemain != 0 ? 1 : 0));
size_t nResultSize = nBlockProcess * nBlockLength;
(*ppcbEcrData) = new char[nResultSize];
DWORD dwBufferLength = nBlockLength;
DWORD dwDataLength;
for (int iBlock = 0; iBlock < nBlockProcess - 1; iBlock++)
{
memcpy((*ppcbEcrData) + (iBlock * nBlockLength),
pcbRawData + (iBlock * nPaddingSize), nPaddingSize);
dwDataLength = nPaddingSize;
if (!CryptEncrypt(m_hKey, NULL, FALSE, 0,
(BYTE*)((*ppcbEcrData) + (iBlock * nBlockLength)),
&dwDataLength, dwBufferLength))
{
throw ("Cannot encrypt data!!");
}
}
memcpy((*ppcbEcrData) + ((nBlockProcess - 1) * nBlockLength),
pcbRawData + ((nBlockProcess - 1) * nPaddingSize), (nRemain ? nRemain : nPaddingSize));
dwDataLength = (nRemain ? nRemain : nPaddingSize);
if (!CryptEncrypt(m_hKey, NULL, TRUE, 0,
(BYTE*)((*ppcbEcrData) + ((nBlockProcess - 1) * nBlockLength)),
&dwDataLength, dwBufferLength))
{
throw ("Cannot encrypt data!!");
}
rnEcrSize = nResultSize;
}
解密:
void CWinRSA::FinishDecrypt(const char* pcbRawData, const size_t nDataSize, char** ppcbDecData, size_t& rnDecSize) const
{
if (m_hProvider == NULL)
{
throw ("Cannot decrypt data with wrong provider!!");
}
if (m_hKey == NULL)
{
throw ("Cannot decrypt data with a wrong key!!");
}
size_t nBlockLength = GetBlockLength();
if ((nDataSize % nBlockLength) != 0)
{
throw ("Cannot decrypt data!! Probably data is corrupted!!");
}
size_t nPaddingSize = nBlockLength - 11;
size_t nBlockProcess = nDataSize / nBlockLength;
size_t nResultSize = nBlockProcess * nPaddingSize;
(*ppcbDecData) = new char[nResultSize];
DWORD dwDataLength;
char* pcbComputeResult = new char[nBlockLength];
for (int iBlock = 0; iBlock < nBlockProcess - 1; iBlock++)
{
memcpy(pcbComputeResult, pcbRawData + (iBlock * nBlockLength), nBlockLength);
if (!CryptDecrypt(m_hKey, NULL, FALSE, 0, (BYTE*)pcbComputeResult, &dwDataLength))
{
throw ("Cannot decrypt data!!");
}
memcpy((*ppcbDecData) + (iBlock * nPaddingSize), pcbComputeResult, nPaddingSize);
}
memcpy(pcbComputeResult, pcbRawData + ((nBlockProcess - 1) * nBlockLength), nBlockLength);
if (!CryptDecrypt(m_hKey, NULL, TRUE, 0, (BYTE*)pcbComputeResult, &dwDataLength))
{
DWORD dwError = GetLastError();
throw ("Cannot decrypt data!!");
}
memcpy((*ppcbDecData) + ((nBlockProcess - 1) * nPaddingSize), pcbComputeResult, nPaddingSize);
rnDecSize = ((nBlockProcess - 1) * nPaddingSize) + dwDataLength;
delete[] pcbComputeResult;
pcbComputeResult = NULL;
}
最佳答案
RSA 不应该以这种方式使用。它真的不是 block 密码(或流密码,就此而言)。据我了解,除了一条“短”消息外,它实际上没有任何密码学用途,所以我对库在一次 key 解密后失败并不感到惊讶。
如果您需要保护任意大小的数据,请使用 RSA 将对称 key 交换为流或 block 密码(如 AES)。
关于c++ - CryptoAPI RSA : CryptDecrypt decrypts only at the first time, 其他调用返回 NTE_BAD_DATA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32933411/
我正在使用 Windows Crypto API,但无法解密文件。在 CryptDecrypt 之后,我的文件的一些第一个字节被解密,但其他字节是垃圾。 例如: 0123456701234567012
我正在尝试制作一个简单的应用程序来加密一个字符串,然后对其进行解密。到目前为止我的代码: int main( int argc, char* argv[] ) { char test[ 32 ] =
Alejandro Magencio 编写的以下代码可以生成 key 对,使用 Microsoft CryptoAPI 加密和解密文件,效果很好,但仅适用于小于 key 的文件: http://blo
我写了一个简单的程序来加载由 openssl 生成的公钥来解密由公钥的私钥加密的字符串。但我不知道为什么我失败了 b = CryptDecrypt(hKey,NULL,FALSE,0,pbEncryp
我目前正在使用 Windows API 使用 C++ 开发一个简单的加密/解密系统。 我相信我已经成功获得 CryptEncrypt()工作 (AES_128) 加密文件。但是当我使用 CryptDe
好的,我正在尝试使用 C++ 中的 Win32 Crypto API 来解密使用 RijndaelManaged 类在 C# (.NET 2) 中加密的字符串。但是我一点运气都没有,我得到了乱码或错误
我曾经与 crypto++ 一起工作以前在 Visual Studio 中,但现在我想使用 wincrypt.h使用 加密字符串的 API 函数AES 256 带有 四 (cbc 模式)。 我做了以下
我制作了一个小应用程序来加密和解密一些文本。只要我直接使用加密的字节数组,一切都很好。但是,一旦我复制数组以模仿将加密文本作为文件发送的过程,解密就不会运行。 为什么我无法使用复制的数组运行解密? u
.net 有这些函数的实现吗?或者您知道我可以从哪里下载该单元,它将这些方法包装在一个 c# 单元中吗? 谢谢! 最佳答案 这就是你要找的here 关于c# - .net 下是否提供 CryptoAP
在documentation它说该函数在 winapi::um::wincrypt::CryptDecrypt 中,但是当我安装 crate 并将其放入我的项目时一切正常,直到我尝试调用我得到的函数以
你好我正在尝试在 C++ 和 C# 之间加密和解密已经使用 CryptEncrypt wincrypt 在这里我使用的代码创建了一个 dll 项目C++语言 #include #include e
我已经编写了加密/解密自定义长度内存缓冲区的程序。加密结束很好;但是我的解密代码在任何缓冲区位置只解密一次数据,对应于 block 条目。其他 block 的解密以 NTE_BAD_DATA 结束。
我正在尝试解密 - 在 C++ 中使用微软的 CryptoAPI - 在 PHP 中使用 mcrypt_encrypt 加密的短消息。 php行是: mcrypt_encrypt( MCRYPT_RI
我正在尝试使用 wincrypt 解密一段文件,但我似乎无法正确解密此函数。这些字节使用 C# 中的 RC2 实现加密,我为加密和解密过程提供相同的密码和 IV(在 C# 中加密,在 C++ 中解密)
我是一名优秀的程序员,十分优秀!