我正在尝试在 iOS 上使用 3DES 和 CBC 模式加密来加密 NSString。
ASP.NET 上也使用了相同的加密方法,并且它们获得的加密字符串可与 Web 服务一起使用。woodcraft554
从 .NET 代码中获取的加密字符串是: 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;
}
我已经比较了vplainText
,vkey
以及vinitVec
从 Objective-C 代码到 .NET 中的代码。他们是一样的。我得到的加密字符串是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 中获得正确的加密字符串?