当前位置: 首页 > 知识库问答 >
问题:

使用IOS加密;使用.NET解密

姬浩渺
2023-03-14

我需要在iPhone或iPad上加密字符串(实际上是XML文件),然后用.NET应用程序解密。感谢David Veksler在这里提出的问题“.NET和iPhone之间的AES互操作性?”,以及在这里发表的博客文章http://automagical.rationalmind.net/2009/02/12/aes-interoperability-between-net-and-iPhone/。

我尽可能地遵循了David的代码,但是经过一些尝试和错误之后,我可能改变了一些事情。下面是加密代码(密码和initVector现在只是硬编码在里面):

    CCCryptorStatus result = CCCryptorCreate(kCCEncrypt,
                                         kCCAlgorithmAES128,
                                         kCCOptionPKCS7Padding, // 0x0000 or kCCOptionPKCS7Padding
                                         (const void *)[@"1234567891123456" dataUsingEncoding:NSUTF8StringEncoding].bytes,
                                         [@"1234567891123456" dataUsingEncoding:NSUTF8StringEncoding].length,
                                         (const void *)[@"0000000000000000" dataUsingEncoding:NSUTF8StringEncoding].bytes,
                                         &thisEncipher
                                         );

    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t remainingBytes = 0;
    size_t movedBytes = 0;
    size_t plainTextBufferSize = 0;
    size_t totalBytesWritten = 0;
    uint8_t *ptr;

    NSData *plainText = [xmlFileText dataUsingEncoding:NSASCIIStringEncoding];

    plainTextBufferSize = [plainText length];
    bufferPtrSize = CCCryptorGetOutputLength(thisEncipher, plainTextBufferSize, true);
    bufferPtr = malloc(bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);
    ptr = bufferPtr;
    remainingBytes = bufferPtrSize;

    result = CCCryptorUpdate(thisEncipher,
                         (const void *)[plainText bytes],
                         plainTextBufferSize,
                         ptr,
                         remainingBytes,
                         &movedBytes
                         );

    ptr += movedBytes;
    remainingBytes -= movedBytes;
    totalBytesWritten += movedBytes;

    result = CCCryptorFinal(thisEncipher,
                        ptr,
                        remainingBytes,
                        &movedBytes
                        );

    totalBytesWritten += movedBytes;

    if (thisEncipher)
    {
        (void) CCCryptorRelease(thisEncipher);
        thisEncipher = NULL;
    }

    if (result == kCCSuccess)
    {
        NSData *encryptedData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)totalBytesWritten];
        [[encryptedData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn] writeToFile:docFile atomically:NO encoding:NSUTF8StringEncoding error:nil];

        NSLog(@"%d:%d:%d:%@:%@", xmlFileText.length,
                                 encryptedData.length,
                                 [encryptedData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn].length,
                                 encryptedData,
                                 [encryptedData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn]);

        if (bufferPtr)
            free(bufferPtr);
        return;
}

下面是解密代码:

    public static string DecryptString(string base64StringToDecrypt, string passphrase)
    {
        //Set up the encryption objects
        using (AesCryptoServiceProvider acsp = GetProvider(Encoding.Default.GetBytes(passphrase)))
        {   
            byte[] RawBytes = Convert.FromBase64String(base64StringToDecrypt);

            ICryptoTransform ictD = acsp.CreateDecryptor();

            //RawBytes now contains original byte array, still in Encrypted state

            //Decrypt into stream
            MemoryStream msD = new MemoryStream(RawBytes, 0, RawBytes.Length);
            CryptoStream csD = new CryptoStream(msD, ictD, CryptoStreamMode.Read);
            //csD now contains original byte array, fully decrypted

            //return the content of msD as a regular string
            return (new StreamReader(csD)).ReadToEnd();
        }
    }

通过对几个点进行比较,可以看出NSData,encryptedData包含的值与byte[],rawbytes相同。但StreamReader.ReadToEnd()之后返回的XML字符串与NSStringXMLFileText匹配,但前16个字符除外。我怀疑问题要么是我加密以获得nsdata*encrypteddata的方式,要么是我将其转换为base64编码的字符串并将其写入文件的方式,要么是我解密byte[]RawBytes的方式,或者是我将解密的csD转换回字符串的方式。如果有人能看出我哪里错了,我会很感激的。

(const void *)[@"0000000000000000" dataUsingEncoding:NSUTF8StringEncoding].bytes

在.net上我正在使用:

new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }

这些可能不等同。

共有1个答案

朱华皓
2023-03-14

如果您的消息的第一部分是乱码,那么很可能您的IV(初始化向量)在加密和解密结束时是不相同的。IV会影响第一个数据块,因此错误的IV会导致第一个数据块错误,而其余的数据块是正确的,这是有道理的。

代码的一端,一个“0”字符字符串用作iv。在另一端,在IV处使用由0值字节组成的字节数组。这些并不相同;“0”字符不一定是0字节值。你必须使IVs相同。

 类似资料:
  • 本文向大家介绍.net core使用MD5加密解密字符串,包括了.net core使用MD5加密解密字符串的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了.net core使用MD5加密解密字符串的具体代码,供大家参考,具体内容如下 调用加密 解密看效果 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我正在iOS上使用加密/解密我的机密密钥,并将其保存在中。已成功设置并加密数据。但是每当我试图解密数据时,它都会给我以下错误: Error domain=nsosstatuserrordomain code=-50\“ecies:未能到aes-gcm解密数据\”userinfo={nsdescription=ecies:未能到aes-gcm解密数据} 此外,在10.3中,使用KseckeyAlgo

  • 加密(不工作): “dost't work”的意思是-它返回一个加密的字符串,该字符串绝不是CF加密的字符串的镜像。最重要的是,当使用上述方法解密时,返回的字符串与最初输入的字符串不匹配(使用.NET/BouncyCastle加密)

  • 问题内容: 我必须使用openssl命令行或C api加密xml文件。输出应为Base64。 一个Java程序将用于解密。该程序由客户提供,不能更改(他们正在将这些代码用于旧版应用程序)。正如您在下面的代码中看到的那样,客户提供了一个密码短语,因此将使用SecretKeySpec方法生成密钥。 Java代码: 我已经测试了几个命令,例如: 但是,使用Java无法成功解密给定的输出。为了进行测试,我

  • 问题内容: 有没有一种方法可以解密Java中的密码。Java将算法实现为。我得到了创建密码哈希的代码。我在下面提到了哈希技术的链接: http://howtodoinjava.com/security/how-to-generate-secure-password-hash- md5-sha-pbkdf2-bcrypt-examples/ 我的要求是以加密格式存储第三方FTP服务器密码,并在需要登

  • 问题内容: 有人要求我用PHP解密使用以下Java类加密的字符串。 我不懂Java,因此我需要一些帮助来理解这种加密。 1)这行是什么意思? 2)我应该为第一个参数使用什么值 3)什么时候应该在我的php脚本中使用MD5? 问题答案: 1)它创建用于基于密码的加密的参数,哈希计算中包含的盐和哈希算法执行的迭代次数(在其自身的输出中)。它用于击退彩虹表攻击,基本上,攻击者必须经过相同的迭代次数才能检