gpt4 book ai didi

objective-c - objective-c 中使用 CBC 模式的 3DES 加密

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:48:26 24 4
gpt4 key购买 nike

我正在尝试在 iOS 上使用 3DES 和 CBC 模式加密来加密 NSString。

在 ASP.NET 上也使用了相同的加密方法,并且他们获得的加密字符串与网络服务一起使用。从.NET代码中得到的woodcraft554加密字符串为:9SWzd+rlvu/tK5UZoCXt8Q==

.NET 使用零填充进行加密。我使用的代码是:

+(NSString*)new3DESwithoperand:(NSString*)plaintext encryptOrDecrypt:(CCOperation)encryptorDecrypt key:(NSString*)key initVec:(NSString*)initVec
{

NSData* data = [plaintext dataUsingEncoding:NSUTF8StringEncoding];
const void *vplainText = [data bytes];;
size_t plainTextBufferSize = [data length];
NSLog(@"%@, Length: %u",[data description],[data length]);

size_t bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
NSLog(@"%zu, sizof of uint8_t: %zu",bufferPtrSize, sizeof(uint8_t));
size_t movedBytes = 0;
uint8_t *bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
NSLog(@"%zu",sizeof(bufferPtr));
memset((void*)bufferPtr, 0x0, bufferPtrSize);
NSLog(@"%zu",sizeof(bufferPtr));
// memset((void *)initVec, 0x0, (size_t) sizeof(initVec));
const void * vkey = [[NSString base64DataFromString:key] bytes];
const void *vinitVec = [[NSString base64DataFromString:initVec] bytes];
NSLog(@"vinitvec: %@",[[NSString base64DataFromString:initVec] description]);

CCCryptorStatus ccStatus;
ccStatus = CCCrypt(encryptorDecrypt,
kCCAlgorithm3DES,
kCCOptionPKCS7Padding & kCCModeCBC,
vkey,
kCCKeySize3DES,
vinitVec,
vplainText,
plainTextBufferSize,
(void*)bufferPtr,
bufferPtrSize,
&movedBytes);

NSData* result = [NSData dataWithBytes:(const void*)bufferPtr length:(NSUInteger)movedBytes];
NSString* str = [NSString base64StringFromData:result length:result.length];
NSLog(@"%@",str);

return str;
}

我比较了 objective-c 代码和 .NET 中的 vplainTextvkeyvinitVec。他们是一样的。我得到的加密字符串是 9SWzd+rlvu8=。我相信这与填充有关。

这是他们使用的等效 .NET 代码:

protected string EncryptCreditCard(string creditCard)
{
try
{
string ENCRYPTION_KEY = ConfigurationManager.AppSettings["ENCRYPTION_KEY"].ToString();
string ENCRYPTION_IV = ConfigurationManager.AppSettings["ENCRYPTION_IV"].ToString();

SymmetricAlgorithm sa = SymmetricAlgorithm.Create("TripleDES");
sa.Key = System.Convert.FromBase64String(ENCRYPTION_KEY);
sa.IV = System.Convert.FromBase64String(ENCRYPTION_IV);
sa.Padding = PaddingMode.Zeros;

byte[] inputByteArray = Encoding.ASCII.GetBytes(creditCard);
MemoryStream mS = new MemoryStream();

ICryptoTransform trans = sa.CreateEncryptor();
byte[] buf = new byte[2048];
CryptoStream cs = new CryptoStream(mS, trans, CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();

return Convert.ToBase64String(mS.ToArray());
}
catch
{
return "";
}
}

如何在 iOS 中获取正确的加密字符串?

最佳答案

通过使用零填充。您的代码明确指出 kCCOptionPKCS7Padding,这不是零填充。密文在其他方面看起来是相同的。

请注意,最好在 .NET 代码中使用 PaddingMode.PKCS7。它在奇怪的情况下添加了一些数据,即您的纯文本已经是 block 大小的数倍,但它是标准化的并且取消填充不再依赖于纯文本值。

关于objective-c - objective-c 中使用 CBC 模式的 3DES 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12646622/

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