【问题标题】:AES Encryption between iOS and C#iOS和C#之间的AES加密
【发布时间】:2017-05-16 07:58:14
【问题描述】:

我正在使用FBEncryptor 库进行加密和解密。如果我从 iOS 加密数据,它会在 C# 服务器端轻松解密。但是,在解密原始数据的前 10 个字符时,会损坏。

示例:
从 C# 接收到的数据:0Nwr30kSkJxGCYiFg8TUrfW51587SUkS8lQ7Uno7gglxjVGW5gR4MA+isTknjXzK

用于加密的密钥:e64f9fa01f0418

来自 iOS 的解密数据:gZUUTabcdefghijklmnopqrstuvwxyz"}

预期的解密数据:{“成功”:“abcdefghijklmnopqrstuvwxyz”}

iOS端代码:

encryptedios = "0Nwr30kSkJxGCYiFg8TUrfW51587SUkS8lQ7Uno7gglxjVGW5gR4MA+isTknjXzK"
let decryptedString = FBEncryptorAES.decryptBase64String(encryptedios , keyString: "e64f9fa01f0418")

C#代码:

public RijndaelManaged GetRijndaelManaged(String secretKey)
    {
        var keyBytes = new byte[16];
        var secretKeyBytes = Encoding.UTF8.GetBytes(secretKey);
        Array.Copy(secretKeyBytes, keyBytes, Math.Min(keyBytes.Length, secretKeyBytes.Length));
        return new RijndaelManaged
        {
            Mode = CipherMode.CBC,
            Padding = PaddingMode.PKCS7,
            KeySize = 128,
            BlockSize = 128,
            Key = keyBytes,
            IV = keyBytes
        };
    }

    public byte[] Encrypt(byte[] plainBytes, RijndaelManaged rijndaelManaged)
    {
        return rijndaelManaged.CreateEncryptor()
            .TransformFinalBlock(plainBytes, 0, plainBytes.Length);
    }

    public byte[] Decrypt(byte[] encryptedData, RijndaelManaged rijndaelManaged)
    {
        return rijndaelManaged.CreateDecryptor()
            .TransformFinalBlock(encryptedData, 0, encryptedData.Length);
    }

    /// <summary>
    /// Encrypts plaintext using AES 128bit key and a Chain Block Cipher and returns a base64 encoded string
    /// </summary>
    /// <param name="plainText">Plain text to encrypt</param>
    /// <param name="key">Secret key</param>
    /// <returns>Base64 encoded string</returns>
    public String Encrypt(String plainText, String key)
    {
        var plainBytes = Encoding.UTF8.GetBytes(plainText);
        return Convert.ToBase64String(Encrypt(plainBytes, GetRijndaelManaged(key)));
    }

    /// <summary>
    /// Decrypts a base64 encoded string using the given key (AES 128bit key and a Chain Block Cipher)
    /// </summary>
    /// <param name="encryptedText">Base64 Encoded String</param>
    /// <param name="key">Secret Key</param>
    /// <returns>Decrypted String</returns>
    public String Decrypt(String encryptedText, String key)
    {
        var encryptedBytes = Convert.FromBase64String(encryptedText);
        return Encoding.UTF8.GetString(Decrypt(encryptedBytes, GetRijndaelManaged(key)));
    }

【问题讨论】:

  • 显示客户端和服务器代码,否则很难帮助你。
  • 我已经添加了代码细节。 FBEncryptor 库没有变化

标签: c# ios encryption public-key-encryption


【解决方案1】:

当您在解密中使用 不同的 IV 时,您的第一个块会有所不同。在 IOS decryptBase64String(..) 中不要将 IV 作为输入,这会触发它被初始化为全 0。在 C# 中,您将其初始化为与 key 相同的值。

一般而言,IV 需要是在加密时生成的随机值,并与加密数据一起传递。通常它会预先添加加密数据,因此您可以在初始化解密库时轻松获取它。将所有 0 用作 IV 是不好的做法.. 将密钥用作 IV 也是如此。

【讨论】:

  • 您能否提供我应该使用示例代码在哪里更改代码。
  • 在解密字符串的最后获取垃圾数据或在解密字符串中获取零响应。
  • 数据如下\"PayCode\":\"\",\"PaymentCurrency\":\"\"}]}_\u{1B}\0\0\0Ф\u{ 15}\u{0F}\0\0\0P\u{1B}\0")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多