【发布时间】:2018-10-08 02:16:19
【问题描述】:
我已经编写了使用 AES CFB 模式和 XTR-DH 加密 WAV 格式的音频文件的代码,用于生成密钥。
这里的代码
int main()
{
AutoSeededRandomPool aSRPA;
XTR_DH xtrA(aSRPA, 170, 160);
string inputfilename;
string encryptfilename;
int aesKeyLength = SHA256::DIGESTSIZE;
int defBlockSize = AES::BLOCKSIZE;
const std::string extention(".wav");
byte iv[AES::BLOCKSIZE];
aSRPA.GenerateBlock(iv, AES::BLOCKSIZE);
SecByteBlock privateA(xtrA.PrivateKeyLength());
SecByteBlock publicA(xtrA.PublicKeyLength());
SecByteBlock secretKeyA(xtrA.AgreedValueLength());
xtrA.GenerateKeyPair(aSRPA, privateA, publicA);
SecByteBlock key(SHA256::DIGESTSIZE);
SHA256().CalculateDigest(key, secretKeyA, secretKeyA.size());
cout << "file path plain text : ";
cin >> inputfilename;
cout << "file path cipher text : ";
cin >> encryptfilename;
if (inputfilename != extention &&
encryptfilename != extention &&
inputfilename.size() > extention.size() &&
encryptfilename.size() > extention.size() &&
inputfilename.substr(inputfilename.size() - extention.size()) ==
".wav" &&
encryptfilename.substr(encryptfilename.size() -
extention.size()) == ".wav")
{
CFB_Mode<AES>::Encryption cfbEncryption(key, aesKeyLength, iv);
cfbEncryption.ProcessData((byte*)inputfilename.c_str(),
(byte*)inputfilename.c_str(),
inputfilename.length() + 1);
FileSink file_kunci(encryptfilename.c_str());
StringSource ss(inputfilename, true,
new StreamTransformationFilter(cfbEncryption,
new Redirector(file_kunci)));
}
}
它可以工作,但是当我读取加密文件时,它不是像音频文件那样的波形。我的代码有什么问题?是否需要将音频文件转换为字节数组或其他东西?
【问题讨论】:
-
我不清楚您要做什么,以及您的数据是什么。我看到的是 AES 加密,而不是 XTR 加密。
StringSource ss(inputfilename, ...)似乎加密了文件名;而不是文件中的数据。我认为你需要一个FileSource fs(inputfilename, ...)(但我可能是错的)。将BlockCipher::ProcessData与管道混合也是一种不寻常的做法。您可以使用两个顺序管道并泵到同一个接收器。管道将附加到接收器file_kunci(而不是覆盖它)。 -
@jww 我只是尝试合并,因为我不知道如何使用 XTR-DH 进行加密。我一直在使用 StreamTransformationFilter 并保存加密的音频并总是出现消息以中断操作
标签: c++ encryption cryptography aes crypto++