سؤال

أحتاج إلى تشفير سلسلة على iPhone وإرسالها إلى .NET ل Decryption باستخدام Triple Des. أنا قادر على تشفير / فك تشفيرها على iPhone ومع .NET، لكنني أحصل على نتائج مختلفة في كلتا النظامين.

يمكنني استخدام نفس الكود مثل التشفير / فك التشفير مع AES بين .NET و iPhone في هنا

الشيء الوحيد الذي قمت بتغييره هو خوارزمية التشفير، لذلك حيث تقول AescryptoserviceProvider، وضعت ثلاث مرات

كما هو الحال في .NET الشيء الوحيد الذي قمت بتغييره هو خوارزمية التشفير، حيث تقول kccalgorithmaes128، أضع kccalgorithm3des

ماذا ينقصني؟

تحديث

شكرا على ردودكم.

إذا بقيت في نفس المنصة، يمكنني تشفير / فك تشفيرها دون مشكلة، ولكن إذا قمت بتشفير iPhone وفكشن في .NET. هناك مشكلة لأنه في كل نظام أساسي له نتائج مختلفة مع نفس المدخلات.

كما قال الترابط، أعتقد أن المشكلة تتعلق بالملح، لكنني لم أستطع العثور على أي وثائق شا أو MD5 التي تستخدم الخوارزمية في كل منصة، أو أي معلمة لتخصيص هذا.

هنا هو الكود الذي أستخدمه بالفعل في iPhone:

int main(int argc, char *argv[]){
    NSString * _secret = @"hello";    
    NSString * _key = @"1234567890";    
    _out = [self doCipher:_secret key:_key context:kCCEncrypt];    
    NSLog(@"encrypted data in str: %@", _out);    
    _outDecrypted = [StringEncryption doCipher:_out key:_key context:kCCDecrypt];    
    NSLog(@"decrypted data in str: %@", _outDecrypted);    
}

+ (NSString *)doCipher:(NSString *)sTextIn key:(NSString *)sKey
               context:(CCOperation)encryptOrDecrypt {

    NSMutableData * dTextIn;
    if (encryptOrDecrypt == kCCDecrypt) {    
        dTextIn = [[[NSData alloc] base64DecodeString:sTextIn ]mutableCopy];    
    }    
    else{    
        dTextIn = [[sTextIn dataUsingEncoding: NSASCIIStringEncoding]mutableCopy];    
    }       
    NSMutableData * dKey = [[sKey dataUsingEncoding:NSASCIIStringEncoding]mutableCopy];            
    [dKey setLength:24];        
    uint8_t *bufferPtr1 = NULL;    
    size_t bufferPtrSize1 = 0;    
    size_t movedBytes1 = 0;    
    uint8_t iv[kCCBlockSize3DES];    
    memset((void *) iv, 0x0, (size_t) sizeof(iv));    
    bufferPtrSize1 = ([sTextIn length] + kCCBlockSize3DES) & ~(kCCBlockSize3DES -1);    
    bufferPtr1 = malloc(bufferPtrSize1 * sizeof(uint8_t));    
    memset((void *)bufferPtr1, 0x00, bufferPtrSize1);    
    ccStatus = CCCrypt(encryptOrDecrypt, // CCOperation op    
        kCCAlgorithm3DES, // CCAlgorithm alg    
        kCCOptionPKCS7Padding, // CCOptions options    
        [dKey bytes], // const void *key    
        [dKey length], // size_t keyLength    
        iv, // const void *iv    
        [dTextIn bytes], // const void *dataIn
        [dTextIn length],  // size_t dataInLength    
        (void *)bufferPtr1, // void *dataOut    
        bufferPtrSize1,     // size_t dataOutAvailable 
        &movedBytes1);      // size_t *dataOutMoved     
    NSString * sResult;    
    if (encryptOrDecrypt == kCCDecrypt){    
        sResult = [[[ NSString alloc] initWithData:[NSData dataWithBytes:bufferPtr1     
                           length:movedBytes1] encoding:NSASCIIStringEncoding] autorelease];    
    }    
    else {    
        NSData *dResult = [NSData dataWithBytes:bufferPtr1 length:movedBytes1];    
        sResult = [dResult base64EncodeData:dResult];    
    }       
    return sResult;
}   

هنا هو الكود الذي أستخدمه ل .NET

    class Program
    {
        static void Main(string[] args)
        {
           string key = "1234567890";
           string secret = "hello";
           string crypto = EncryptedString.EncryptString(secret, key);
           Console.WriteLine(crypto);
           secret = EncryptedString.DecryptString(crypto, key);
           Console.WriteLine(secret);
           Main(null); 

        }

    }


 public class EncryptedString
    {
        public static string EncryptString(string plainSourceStringToEncrypt, string passPhrase)
        {
            //Set up the encryption objects
            using (TripleDESCryptoServiceProvider acsp = GetProvider(Encoding.ASCII.GetBytes(passPhrase)))
            {
                byte[] sourceBytes = Encoding.ASCII.GetBytes(plainSourceStringToEncrypt);
                ICryptoTransform ictE = acsp.CreateEncryptor();

                //Set up stream to contain the encryption
                MemoryStream msS = new MemoryStream();

                //Perform the encrpytion, storing output into the stream
                CryptoStream csS = new CryptoStream(msS, ictE, CryptoStreamMode.Write);
                csS.Write(sourceBytes, 0, sourceBytes.Length);
                csS.FlushFinalBlock();

                //sourceBytes are now encrypted as an array of secure bytes
                byte[] encryptedBytes = msS.ToArray(); //.ToArray() is important, don't mess with the buffer
                String b64 =  System.Text.ASCIIEncoding.ASCII.GetString(encryptedBytes);
                return Convert.ToBase64String(encryptedBytes);
            }
        }


        public static string DecryptString(string base64StringToDecrypt, string passphrase)
        {
            //Set up the encryption objects
            using (TripleDESCryptoServiceProvider acsp = GetProvider(Encoding.Default.GetBytes(passphrase)))
            {
                byte[] RawBytes = Convert.FromBase64String(base64StringToDecrypt);
                ICryptoTransform ictD = acsp.CreateDecryptor();
                MemoryStream msD = new MemoryStream(RawBytes, 0, RawBytes.Length);
                CryptoStream csD = new CryptoStream(msD, ictD, CryptoStreamMode.Read);
                return (new StreamReader(csD)).ReadToEnd();
            }
        }

        private static TripleDESCryptoServiceProvider GetProvider(byte[] key)
        {
            TripleDESCryptoServiceProvider result = new TripleDESCryptoServiceProvider();
            result.Mode = CipherMode.CBC;
            result.Padding = PaddingMode.PKCS7;
            result.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 };
            result.Key = key;
            return result;
        }

    }
هل كانت مفيدة؟

المحلول

AES Keys هي 128، 192 أو 256 بت، 192 نادرا ما ينظر إليها.

Triple DSE هو عادة 112 بت ولكن يمكن أن يكون 168 بت. لاحظ أن هذا محدد في البتات. يتوقع Triple des كل بايت أن يكون لديك بت متكافئ وبالتالي 7 بتات بيانات. عادة ما يتم استخدام Triple des في وضع التوافق (متوافق مع Single Des) من خلال أداء المشفر الواحد DES، فك شفرة وترميز مع مفتاح واحد يستخدم لكل من الترميز والكشف، K1، K2، K1. وهكذا مفتاح 8 بايت * 7 بت * 2 = 112. في بعض الأحيان فك التشفير، يتم استخدام التشفير، فك التشفير لذلك يمكن أن يكون هذا أيضا مشكلة.

احصل على المفاتيح الصحيحة أولا. نظرا لأنك تغير من AES إلى 3D، فإن الأحجام الرئيسية ستكون مختلفة، قد تكون مشكلة. تأكد أيضا من صحة الأوضاع و IVS.

أفضل رهان هو تفريغ المفتاح، الرابع (إذا كان هناك واحد) والبيانات في Hex على جانبي وظيفة Crypto وعلى كلا النظامين. أول عمل للحصول على هذه للمطابقة. ثم المشكلة موجودة في Base64 أو أيا كانت التلاعب الأخرى المعنية.

نصائح أخرى

تحتاج إلى مطابقة جميع مدخلاتك ومفاتيحك وأملاحاتها وخوارزمياتك على كلا الجانبين لهذا العمل بالضبط. سينتج AescryptoserviceProvider و TripleDesserviceProvider نتائج مختلفة و KCCalgorithmaes128 و KCCalgorithm3des ستنتج نتائج مختلفة.

كن في اعتبارك القيمة العشوائية ستضيف حزمة Crypto .NET إلى بياناتك قبل التشفير، إذا كنت أتذكر بشكل صحيح، فمن عادة أول 16 بت من البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top