如何使用Crypto ++加密字节数组

时间:2013-11-06 14:08:20

标签: c++ arrays encryption crypto++

如何使用Crypto ++的RSA实现加密字节数组?我已经找到了一个字符串示例。但我找不到一个很好的例子,如何对字节数组做同样的事情。

这是我的第一次尝试:

//dataSize:     Size of data that is going to be send
//dataToSend    Bytes to send to the user
//seedPool      is an AutoSeededRandomPool

CryptoPP::RSAES_OAEP_SHA_Encryptor encryptor(publicKey);

int size = 64000; 
byte * cipher = new byte(size);

CryptoPP::ArraySink* test = new CryptoPP::ArraySink(cipher, size);
CryptoPP::ArraySource as((byte*)dataToSend, dataSize, true, new CryptoPP::PK_EncryptorFilter(seedPool, encryptor, test));

int newDataSize = test->TotalPutLength();
unsigned int bytesSend = ::send(socketLink, (char *)(cipher), (int)newDataSize, 0);

delete[] cipher;

这不起作用。 TotalPutLength将始终返回0,但数据已放入密码。

实施此操作的安全方法是什么?我不希望因缓冲区溢出或任何其他攻击而受到攻击。

1 个答案:

答案 0 :(得分:2)

  

byte * cipher = new byte(size);

我相信这应该是:

byte * cipher = new byte[size];

否则,我认为你将一个字节初始化为6400(被截断为0x00)。


  

CryptoPP :: ArraySink * test = new CryptoPP :: ArraySink(cipher,size);

这有点不同。如果您愿意,可以不要使用内存管理器:

 CryptoPP::ArraySink test(cipher, size);

  

int newDataSize = test-> TotalPutLength();

我从未使用过TotalPutLength,我没有在BufferedTransformationSink上看到它。所以我对它的回归没有任何建议。

TotalPutLength可以使用。如果接收器已满,ArraySink可能会返回错误的值。如果阵列是固定的并且对于所有数据而言太小,则会发生这种情况。我们在Crypto ++ 5.6.3或5.6.4中清除了该问题。

如果要计算处理的字节数(即使接收器不能存储它们的字节),那么您也可以使用MeterFilter

byte data[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };

string encoded;
MeterFilter meter( new StringSink( encoded ) );

ArraySource( data, sizeof( data ), true,
    new HexEncoder(
        new Redirector( meter ),
        true /*UCase*/, 2 /*Group*/,
        " " /*Separator*/
    )
);

cout << "processed " << meter.GetTotalBytes() << " bytes" << endl;
cout << encoded << endl;

输出:

Processed 23 bytes
00 01 02 03 04 05 06 07

  

如何使用Cryptopp RSA实现加密字节数组

现在我们正在谈论;)在RSA Encryption上的Crypto ++ wiki上试试这个。

////////////////////////////////////////////////
// Generate keys
AutoSeededRandomPool rng;

InvertibleRSAFunction params;
params.GenerateRandomWithKeySize( rng, 1536 );

RSA::PrivateKey privateKey( params );
RSA::PublicKey publicKey( params );

string plain="RSA Encryption", cipher, recovered;

////////////////////////////////////////////////
// Encryption
RSAES_OAEP_SHA_Encryptor e( publicKey );

StringSource ss1( plain, true,
    new PK_EncryptorFilter( rng, e,
        new StringSink( cipher )
    ) // PK_EncryptorFilter
 ); // StringSource

////////////////////////////////////////////////
// Decryption
RSAES_OAEP_SHA_Decryptor d( privateKey );

StringSource ss2( cipher, true,
    new PK_DecryptorFilter( rng, d,
        new StringSink( recovered )
    ) // PK_DecryptorFilter
 ); // StringSource

assert( plain == recovered );