【问题标题】:AES 128 Cross-Platform Swift / C#AES 128 跨平台 Swift / C#
【发布时间】:2016-02-04 22:11:51
【问题描述】:

我一直在尝试在 iOS 和 .NET 上进行加密和解密,但不是很成功。我用过this question,但我得到了错误:

指定的初始化向量 (IV) 与此算法的块大小不匹配。

这是我使用 CryptoSwift 的 Swift 加密代码:

let encrypt = try! "oauth_token".AES_encrypt("my key here (is 32 characters long)", iv: "1234567890123456")

func AES_encrypt(key: String, iv: String) throws -> String {
    let data = self.dataUsingEncoding(NSUTF8StringEncoding)
    let enc = try AES(key: key, iv: iv, blockMode:.CBC).encrypt(data!.arrayOfBytes(), padding: PKCS7())
    let encData = NSData(bytes: enc, length: Int(enc.count))
    let base64String: String = encData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0));
    let result = String(base64String)
    return result
}



还有我的 .NET 解密代码:

public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] key, byte[] iv)
    {
        byte[] decryptedBytes = null;

        using (MemoryStream ms = new MemoryStream())
        {
            using (RijndaelManaged AES = new RijndaelManaged())
            {
                AES.KeySize = 256;
                AES.BlockSize = 128;

                AES.Key = key;
                AES.IV = iv;

                AES.Mode = CipherMode.CBC;

                using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                    cs.Close();
                }
                decryptedBytes = ms.ToArray();
            }
        }

        return decryptedBytes;
    }



byte[] encrypted_text = Convert.FromBase64String("secret token");
byte[] key = Convert.FromBase64String("32 character key");
byte[] iv = Convert.FromBase64String("0123456789012345");

string plaintext = Convert.ToBase64String(AES_Decrypt(encrypted_text, key, iv));

【问题讨论】:

  • 这种 Xamarin 是否与 CryptoSwift 绑定? “AES_encrypt”到底是什么?

标签: c# swift aes rijndaelmanaged


【解决方案1】:

块大小为 16 字节 (AES.blockSize)。要么您使用的是旧版本,要么您的 AES_encrypt() 有问题(AES_encrypt 不是 CryptoSwift 的一部分)。

自述文件中的简单示例:

let input: NSData // data to encrypt
let encrypted = try? input.encrypt(AES(key: "secret0key000000", iv:"0123456789012345"))

或者这个

// Encrypt string and get Base64 representation of result
let base64: String = try? "my secret string".encrypt(AES(key: "secret0key000000", iv: "0123456789012345"))

【讨论】:

  • 我刚刚检查了您的“AES_encrypt()”,没有发现任何问题。
  • 我得到的问题是 C# 说密钥或 IV 的大小错误
  • @GabrielJones 我不是 C# 专家,但很确定 Convert.FromBase64String("0123456789012345"); 不是您想要的。 “0123456789012345”可能不是base64编码值
  • 我已经用不同的方式解决了这个问题,谢谢!
  • @brimstone 你是如何解决这个问题的?您介意提供您的解决方案吗?
猜你喜欢
  • 2019-09-14
  • 1970-01-01
  • 2011-04-14
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多