菜鸟教程小白 发表于 2022-12-13 12:19:36

c# - Objective-C 中的字符串加密在 C# 中解密


                                            <p><p>我正在构建一个使用 c# 网络服务的 iPhone 应用程序。我的 iPhone 应用程序接收一些数据并对其进行加密并将其传递给网络服务。如何在 C# 中解密数据?</p>

<p>我的 iPhone 应用程序包含以下代码:</p>

<pre><code>NSString *pString = @&#34;Some string to be encoded&#34;;
NSString *key = @&#34;My encryption key&#34;;

NSData *pData = ;

pData = ;
NSString *pID = ;
</code></pre>

<p>编辑:数据已经存储在网络服务中,所以我不能轻易改变加密方法。 C# 应用程序不在服务器上,因此不可能泄露 key 。</p>

<p>我尝试了以下 C# 代码来解密数据:</p>

<pre><code>    static string DecryptString(string encryptedText, string key)
    {
      byte[] encryptedString = Convert.FromBase64String(encryptedText);
      byte[] encryptionKey = Encoding.UTF8.GetBytes(key.Substring(0, 32));

      using (var provider = new AesCryptoServiceProvider())
      {
            provider.Mode = CipherMode.CBC;
            provider.Padding = PaddingMode.PKCS7;
            provider.Key = encryptionKey;
            using (var ms = new MemoryStream(encryptedString))
            {
                // Read the first 16 bytes which is the IV.
                byte[] iv = new byte;
                ms.Read(iv, 0, 16);
                provider.IV = iv;

                using (var decryptor = provider.CreateDecryptor())
                {
                  using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                  {
                        using (var sr = new StreamReader(cs))
                        {
                            return sr.ReadToEnd();
                        }
                  }
                }
            }
      }
    }
</code></pre>

<p>但是,我得到以下异常:</p>

<blockquote>
<p>System.Security.Cryptography.CryptographicException was unhandled<br/>
HResult=-2146233296   Message=Padding is invalid and cannot be
removed.</p>
</blockquote>

<p>DecryptString接收到的加密文本长度为80字节。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>示例 ObjC 代码默认使用 CBC 调制解调器、PKCS#7 填充和 16 个 <code>0x00</code> 字节的默认 iv。</p>

<p>C# 还使用 CBC 模式和 PKCS#7 填充。解密代码需要一个 16 字节的 iv 预先附加到加密数据,但它不存在。</p>

<pre><code>byte[] iv = new byte;
ms.Read(iv, 0, 16);
provider.IV = iv;
</code></pre>

<p>这需要更改,以便 <code>iv</code> 设置为 16 个 <code>0x00</code> 字节的数组,并且 <code>ms.Read(iv, 0, 16)</code> 语句需要删除,以便解密函数获得所有加密数据。</p>

<p>注意事项:</p>

<ol>
<li><p>在加密中使用 default 任何东西都是一个坏主意,始终提供正确长度的数据。</p></li>
<li><p>需要增加对加密数据的鉴权,以判断 key 是否错误或数据是否被篡改。</p></li>
<li><p>确实应该使用一个版本号和一个随机 IV,并将其添加到加密的前面,因此您真的应该考虑更正它。这说明了为什么通常需要提供和使用版本号。</p></li>
</ol>

<p>RNCryptor 涵盖了上述问题。</p>

<p>还需要考虑加密 key 的处理,以便尽可能安全。</p></p>
                                   
                                                <p style="font-size: 20px;">关于c# - Objective-C 中的字符串加密在 C# 中解密,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/34259933/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/34259933/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: c# - Objective-C 中的字符串加密在 C# 中解密