【问题标题】:Encrypt an audio file with AES and XTR-DH Crypto++使用 AES 和 XTR-DH Crypto++ 加密音频文件
【发布时间】: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(而不是覆盖它)。
  • 编辑后,这看起来不寻常:xtrA.GenerateKeyPair(aSRPA, privateA, publicA);。我认为您应该切换到DLIESECIES。两者都是集成的加密方案,都基于 Diffie-Hellman 问题。 DLIES 在整数域之上,ECIES 在椭圆曲线域之上。否则 DLIES 和 ECIES 大致相同。
  • @jww 我只是尝试合并,因为我不知道如何使用 XTR-DH 进行加密。我一直在使用 StreamTransformationFilter 并保存加密的音频并总是出现消息以中断操作

标签: c++ encryption cryptography aes crypto++


【解决方案1】:

由于您的问题标题和代码不同,不清楚您真正想要什么,因此我将您的代码作为参考。在我看来,您似乎想加密文件并稍后解密。

你的 if 块实在是太多了......你可以用 std::filesystem 轻松完成所有事情。

此外,如果您不熟悉密码算法和/或库本身的文档,可能会发生这种情况。首先你ProcessData 似乎加密了inputfilename (?) 中的字符串。

毕竟,您可能想查看库的文档和提供的示例 - 这些已经帮助您了解如何处理事情。

这是一个独立的文件加密和解密示例。

#include <filesystem>

#include "..\CryptoLib\osrng.h"
#include "..\CryptoLib\modes.h"
#include "..\CryptoLib\files.h"
#include "..\CryptoLib\aes.h"

template <typename T, std::size_t N>
constexpr std::size_t FixedArraySize(T(&arr)[N])
{ return N; }

int wmain(int argv, wchar_t **args)
{
    try
    {
        using namespace CryptoPP;

        constexpr CryptoPP::byte    IV[]    = { 0xab,0x10,0x55,0x29,0x73,0xb9,0xae,0xba,0xe9,0xe9,0xe5,0x26,0x35,0x66,0x63,0x55 };
        constexpr char              key[]   = "ABCDEFGHIJKLMNOP";

        const std::string extension         = ".TEST";
        const std::string sourceFile        = __FILE__;
        const std::string destinationFile   = std::filesystem::path("Encrypted").replace_extension(extension).string();
        const std::string finalFile         = std::filesystem::path("Decrypted").replace_extension(extension).string();

        {
            CFB_Mode<AES>::Encryption encryption(reinterpret_cast<const CryptoPP::byte*>(key), FixedArraySize(key) - 1, IV);
            FileSource fsEnc(sourceFile.c_str(), true, new StreamTransformationFilter(encryption, new FileSink(destinationFile.c_str())));

            CFB_Mode<AES>::Decryption decryption(reinterpret_cast<const CryptoPP::byte*>(key), FixedArraySize(key) - 1, IV);
            FileSource fsDec(destinationFile.c_str(), true, new StreamTransformationFilter(decryption, new FileSink(finalFile.c_str())));
        }

        std::filesystem::remove(destinationFile);
        std::filesystem::remove(finalFile);
    }
    catch (const std::exception &e)
    {
        std::cout << e.what() << std::endl;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-16
    • 2015-03-29
    • 2021-07-30
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2014-02-06
    相关资源
    最近更新 更多