gpt4 book ai didi

ios - 如何将 NSData 对象中的 key 放入 Crypto++ 的 key/iv 数组中?

转载 作者:行者123 更新时间:2023-11-28 22:21:30 24 4
gpt4 key购买 nike

我正在尝试为一些将使用 Crypto++ 库的加密操作创建一个 Objective-C 包装类。我有几个问题,

这是我使用的代码

- (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) 如何将 key /IV 作为方法参数传递?查看注释代码,这不起作用...

2) 我在尝试解密时崩溃了

libc++abi.dylib:以 CryptoPP::InvalidCiphertext 类型的未捕获异常终止:StreamTransformationFilter:密文长度不是 block 大小的倍数

为什么?我认为解密是自动的,加密会相应地填充明文......我还想在方法中添加一个 HMAC...这将在加密后添加并在解密前检查,对吗?

最佳答案

要获得填充,您必须自己完成或拥有支持标准填充的 API,例如 PKCS7。基本加密,流密码除外,是基于 block 的,在较低级别必须有完整的 block 。一些更高级别的 API 提供填充。

我将 key 、iv 和数据 作为 NSData * 传递,并将字节作为 data.bytes 访问。
对于密码输出数据:

NSMutableData  *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];
// ...
dataOut.mutableBytes,
dataOut.length,
&cryptBytes
// ...
dataOut.length = cryptBytes;

我的 API 调用类似于:

- (NSString *)encryptWithSerpentText:(NSString *)text key:(NSData *)key iv:(NSData *)iv;

Mac 很好,但您将如何验证它。最好研究身份验证的最佳实践。

对于 HMAC,只需使用 Apple 提供的 CommonCrypto 库。 CommonCrypto 还支持:AES128、DES、3DES、CAST、RC4 和 Blowfish,但不支持 Serpent。

最后,为了让事情正常运行,在服务器和客户端中记录每个步骤,这样就可以找到因错误数据而失败的步骤。在这种情况下,针对混合 Objective-C/C++ 版本的直接 C++ 版本。

关于ios - 如何将 NSData 对象中的 key 放入 Crypto++ 的 key/iv 数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20271678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com