Я пытаюсь создать класс-оболочку Objective-C для некоторых криптографических операций, которые будут использовать библиотеку Crypto++. У меня есть несколько вопросов,
Это код, который я использую
- (void)testSerpentEncryptonMechanism
{
byte key[ CryptoPP::Serpent::MAX_KEYLENGTH ], iv[ CryptoPP::Serpent::BLOCKSIZE ];
::memset( key, 0x50 , CryptoPP::Serpent::MAX_KEYLENGTH );
::memset( iv, 0x10, CryptoPP::Serpent::BLOCKSIZE );
NSString *andThisShalBeEncrypted = @"Serpentine and black...";
NSLog(@"will encrypt %@",andThisShalBeEncrypted);
NSString *encrypted = [self encryptWithSerpentString:andThisShalBeEncrypted withKey:key];
NSLog(@"encrypted:%@",encrypted);
NSString *decrypted = [self decryptWithSerpentString:encrypted withKey:key andIV:iv];
NSLog(@"decrypted: %@",decrypted);
}
- (NSString *)encryptWithSerpentString:(NSString *)plaintext withKey:(byte[])keyArray
{
std::string ptext = [plaintext UTF8String];
std::string ciphertext;
byte key[ CryptoPP::Serpent::MAX_KEYLENGTH ], iv[ CryptoPP::Serpent::BLOCKSIZE ];
::memset( key, 0x50 , CryptoPP::Serpent::MAX_KEYLENGTH );
::memset( iv, 0x10, CryptoPP::Serpent::BLOCKSIZE );
CryptoPP::Serpent::Encryption serpentEncryptor (key, CryptoPP::Serpent::MAX_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcSerpentEncryptor (serpentEncryptor, iv);
CryptoPP::StreamTransformationFilter stfSerpentEncryptor(cbcSerpentEncryptor, new CryptoPP::StringSink (ciphertext));
stfSerpentEncryptor.Put( reinterpret_cast<const unsigned char*>( ptext.c_str() ), ptext.length() + 1);
stfSerpentEncryptor.MessageEnd();
std::string finalCT;
CryptoPP::StringSource base64Encoder (ciphertext, true, new CryptoPP::Base64Encoder(new CryptoPP::StringSink(finalCT)));
return @(finalCT.c_str());
}
- (NSString *)decryptWithSerpentString:(NSString *)ciphertext withKey:(byte[])keyArray andIV:(byte[])initializationVector
{
std::string ctext;
std::string plaintext;
byte key[ CryptoPP::Serpent::MAX_KEYLENGTH ], iv[ CryptoPP::Serpent::BLOCKSIZE ];
// ::memset( key, &keyArray , CryptoPP::Serpent::MAX_KEYLENGTH );
// ::memset( iv, (byte[])initializationVector, CryptoPP::Serpent::BLOCKSIZE );
::memset( key, 0x50 , CryptoPP::Serpent::MAX_KEYLENGTH );
::memset( iv, 0x10, CryptoPP::Serpent::BLOCKSIZE );
// decode from base64
std::string encoded = [ciphertext UTF8String];
CryptoPP::StringSource base64Encoder (encoded, true, new CryptoPP::Base64Decoder(new CryptoPP::StringSink(ctext)));
CryptoPP::Serpent::Decryption serpentDecryptor (key, CryptoPP::Serpent::MAX_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcSerpentDecryptor (serpentDecryptor, iv);
CryptoPP::StreamTransformationFilter stfSerpentDecryptor(cbcSerpentDecryptor, new CryptoPP::StringSink (ctext));// crash
stfSerpentDecryptor.Put( reinterpret_cast<const unsigned char*>( ctext.c_str() ), ctext.length() + 1);
stfSerpentDecryptor.MessageEnd();
return @(ctext.c_str());
}
1) Как передать ключ/IV в качестве параметров метода? Смотрите закомментированный код, он не работает...
2) Я получаю вылет при попытке расшифровать
libc++abi.dylib: завершение с необработанным исключением типа CryptoPP::InvalidCiphertext: StreamTransformationFilter: длина зашифрованного текста не кратна размеру блока
Почему? Я думал, что расшифровка была автоматической, и шифрование соответствующим образом дополнит открытый текст... Я также хотел бы добавить HMAC к методам... Это будет добавлено после шифрования и проверено перед расшифровкой, верно?