2

iOS で CBC モード暗号化を使用して 3DES を使用して 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、objective-c のコードを .NET のコードと比較しました。それらは同じです。取得している暗号化された文字列は. パディングと関係があると思います。vkeyvinitVec9SWzd+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 で正しい暗号化された文字列を取得するにはどうすればよいですか?

4

2 に答える 2

1

ゼロパディングを使用する。あなたのコードは明確に述べてkCCOptionPKCS7Paddingいますが、これはゼロパディングではありません。それ以外の場合、暗号文は同じように見えます。

PaddingMode.PKCS7.NETコードで使用する方がよいことに注意してください。プレーンテキストのサイズがすでにブロックサイズの数倍であるという奇妙な場合にいくつかのデータが追加されますが、標準化されており、パディング解除はプレーンテキストの値に依存しなくなりました。

于 2012-10-01T07:43:58.207 に答える
0

問題は、暗号化に使用される「キー」にあります。iOS は 24Byte キーを使用し、Adnroid と .NET は 16Byte キーを使用します。

キー生成を示す同じ問題の詳細な解決策を投稿しました。iOS で生成された異なる暗号化値の解決策

于 2014-10-20T05:19:48.797 に答える