【发布时间】:2015-01-24 16:06:29
【问题描述】:
我正在研究一种用于安全通信的新协议,但我在解密密文时遇到了问题。
数据包保存在 uint8_t* 变量中并加密。直到这部分一切顺利。但是当我尝试解密时,我遇到了以下问题:
1) 如果我发送向量和大小(实际上是 20 但我只想解密最后 16 个字节):
CBC_Mode< AES >::Decryption decryptor;
decryptor.SetKeyWithIV( key, CryptoPP::AES::DEFAULT_KEYLENGTH, iv );
CryptoPP::StringSource ss( vector+4, 16 , true,
new CryptoPP::StreamTransformationFilter( decryptor,
new CryptoPP::StringSink( decryptedtext ) ) );
我明白了:
terminate called after throwing an instance of 'CryptoPP::InvalidCiphertext'
what(): StreamTransformationFilter: invalid PKCS #7 block padding found
2)如果我只是发送没有大小的矢量:
CryptoPP::StringSource ss( vector+4, true,
new CryptoPP::StreamTransformationFilter( decryptor,
new CryptoPP::StringSink( decryptedtext ) ) );
程序运行,但我得到的都是 00:
Text Encrypted (20 bytes)
8c 97 b7 d8 74 80 3d 9f 9f 62 2e 93 38 c7 d1 b de a4 21 80
Text Decrypted (16 bytes)
0 0 0 0 0 0 0 0 68 0 0 0 0 0 0 0 0 0 0 0
我读到可能是密钥生成不正确,但我正在使用 16 的大小,我是这样做的:
byte key[ CryptoPP::AES::DEFAULT_KEYLENGTH ], iv[ CryptoPP::AES::BLOCKSIZE ];
memset( key, 0x00, CryptoPP::AES::DEFAULT_KEYLENGTH );
memset( iv, 0x00, CryptoPP::AES::BLOCKSIZE );
3) 我还尝试将向量转换为 char 并像字符串一样发送:
CryptoPP::StringSource ss( reinterpret_cast<const unsigned char*>( (vector + 4) ), 16, true,
new CryptoPP::StreamTransformationFilter( decryptor,
new CryptoPP::StringSink( decryptedtext ) ) );
但我又得到了同样的东西:
terminate called after throwing an instance of 'CryptoPP::InvalidCiphertext'
what(): StreamTransformationFilter: invalid PKCS #7 block padding found
请帮忙,我已经尝试了几天来找出问题所在。这花了我太长时间,我找不到解决方案。
有人知道会发生什么吗?
如果您需要更多详细信息、代码或任何内容,请告诉我。
编辑:
4) 我尝试的另一件事是(构造解密器的另一种方法):
CryptoPP::AES::Decryption aesDecryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption( aesDecryption, iv );
CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink( decryptedtext ) );
stfDecryptor.Put( reinterpret_cast<const unsigned char*>( (vector + 4) ), 16 );
stfDecryptor.MessageEnd();
但我也一样:
terminate called after throwing an instance of 'CryptoPP::InvalidCiphertext'
what(): StreamTransformationFilter: invalid PKCS #7 block padding found
编辑2:
向量是用这一行创建的(向量的填充方式放在这里很复杂,因为我使用的是网络编码平台):
uint8_t* vector;
编辑3:
这就是我加密向量的方式。
CryptoPP::AES::Encryption aesEncryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption( aesEncryption, iv );
CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, new CryptoPP::StringSink( ciphertext ) );
stfEncryptor.Put( reinterpret_cast<const unsigned char*>( (vector + 4) ), 16 );
stfEncryptor.MessageEnd();
然后我再次将密文放入向量中:
std::cout << std::endl << std::endl;
for(int i=0;i < 16; i++){
*(vector+ i + 4) = (ciphertext[i]) ;
}
【问题讨论】:
-
准确发布
vector是什么。它无法由您发布的代码确定。如果不是std::vector,则将变量命名为与标准 C++ 类相同的名称不是一个好主意。 -
@Niemand - 您在第三次和第四次编辑中提供的信息有冲突。第三次编辑使用
StreamTransformationFilter::DEFAULT_PADDING,即StreamTransformationFilter::PKCS_PADDING。第四次编辑使用StreamTransformationFilter::NO_PADDING。您确实应该将其简化为您正在使用的实际代码的最小工作示例。 -
@Niemand - 请从问题中删除第 4 次编辑,并将其添加为答案。然后,接受你自己的答案。这就是 Stack Overflow 的工作原理。