我 使用 C # 中 的 EasyCrypto 加密 了 一 个 字符 串 , 代码 如下
加密 C # :
/*
EasyCrypto encrypted key format from CryptoContainer.cs file from the EasyCrypto source on GitHub.
* Format:
* 04 bytes 00 - MagicNumber
* 02 bytes 04 - DataVersionNumber
* 02 bytes 06 - MinCompatibleDataVersionNumber
* 16 bytes 08 - IV
* 32 bytes 24 - Salt
* 19 bytes 56 - Key check value
* 48 bytes 75 - MAC
* 04 bytes 123 - Additional header data length
* xx bytes 127 - Additional data
* ----- end of header ----- (sum: 127)
* xx bytes - additional header data (0 for version 1)
* xx bytes - data
*/
AesEncryption.EncryptWithPassword("data to encrypt", "password string");
/*
Method Description:
Encrypts string and returns string. Salt and IV will be embedded to encrypted string. Can later be decrypted with
EasyCrypto.AesEncryption.DecryptWithPassword(System.String,System.String,EasyCrypto.ReportAndCancellationToken)
IV and salt are generated by EasyCrypto.CryptoRandom which is using System.Security.Cryptography.Rfc2898DeriveBytes.
IV size is 16 bytes (128 bits) and key size will be 32 bytes (256 bits).
/*
中 的 每 一 个
我 正在 尝试 使用 Crypto + + 在 C + + 中 解密 , 使用 以下 代码 。 我 刚刚 得到 错误 " 密 文 长度 不 是 块 大小 的 倍数 " , 代码 中 缺少 的 部分 是 什么 ? 任何 帮助 都 将 是 非常 值得 赞赏 的 。
解密 C + + :
string Decrypt() {
// getting CryptoPP::byte array from passowrd
string destination;
CryptoPP::StringSource ss(<hex of password string>, true, new CryptoPP::HexDecoder(new CryptoPP::StringSink(destination)));
CryptoPP::byte* keyByteArray = (CryptoPP::byte*)destination.data();
// getting CryptoPP::byte array from encoded data
string pkDst;
CryptoPP::StringSource ss2(<hex of encoded data>, true, new CryptoPP::HexDecoder(new CryptoPP::StringSink(pkDst)));
CryptoPP::byte* pkByteArray = (CryptoPP::byte*)pkDst.data();
// getting initialization vector from encoded data
CryptoPP::byte iv[16];
for (int i = 8; i < 24; i++) {
iv[i] = pkByteArray[i];
}
string result = CBCMode_Decrypt(keyByteArray, 32, iv);
return result;
}
string CBCMode_Decrypt(CryptoPP::byte key[], int keySize, CryptoPP::byte iv[]) {
string recovered = "";
//Decryption
try
{
CryptoPP::CBC_Mode<CryptoPP::AES>::Decryption d;
d.SetKeyWithIV(key, keySize, iv);
// The StreamTransformationFilter removes
// padding as required.
CryptoPP::StringSource s("encoded string", true, new CryptoPP::StreamTransformationFilter(d, new CryptoPP::StringSink(recovered))); // StringSource
}
catch (const CryptoPP::Exception& e)
{
cerr << e.what() << endl;
exit(1);
}
return recovered;
}
格式
1条答案
按热度按时间j8ag8udp1#
在Crypto++代码中,必须执行以下步骤进行解密:
一种可能的Crypto++实现是:
输出为:
密文是用EasyCrypto生成的:
上一节重点介绍了解密。但是,请注意,出于安全原因,解密 * 之前 * 需要进行身份验证,并且只能对成功验证的数据执行解密。
为了验证,除了IV、salt和密文之外,还必须确定MAC。EasyCrypto应用HMAC-SHA-384作为MAC。仅使用密文来确定MAC,用于验证的密钥与用于加密的密钥相同。
认证时,必须将计算出的MAC和发送的MAC进行比较,如果两者相同,则认证成功(可以进行解密)。
用于身份验证的一种可能的Crypto++实现是:
其成功地认证了样本数据。