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

如何在AES加密中传输带会话密钥的发起向量

杜建章
2023-03-14

因为我是加密概念的新手。我想做的是一个应用程序,它发送的数据是用AES对称技术加密的。另外,我还需要将我以前使用非对称RSA技术加密的密钥以加密格式发送到另一边。我已经完成了使用AES对称加密技术使用256位密钥的加密,现在我已经加密数据,密钥,和启动矢量(IV)在字节。当我试图解密时,我知道起始向量也需要得到准确的数据。

现在我的问题是

public byte[] SymmetricAESEncryption(string plainText, byte[] key, byte[] initVector)
    {
        byte[] encrypted;
        using (Aes objAES = Aes.Create())
        {
            objAES.KeySize = 256;

            ICryptoTransform encryptor = objAES.CreateEncryptor(key, initVector);

            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
        }
        return encrypted;
    } 

C#中的AES解密代码:

static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
    {
        string plaintext = null;
        using (Aes rijAlg = Aes.Create())
        {
            rijAlg.Key = Key;
            rijAlg.IV = IV;
            ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);

            using (MemoryStream msDecrypt = new MemoryStream(cipherText))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        plaintext = srDecrypt.ReadToEnd();
                    }
                }
            }

        }
        return plaintext;

    }

我在C#中的非对称代码

X509Certificate2 objCertificate = new X509Certificate2();
        objCertificate.Import(Encoding.UTF8.GetBytes(rawData.ToString().Trim()));

        RSACryptoServiceProvider objAsyAlgm1 = (RSACryptoServiceProvider)objCertificate.PublicKey.Key;

        byte[] SessionKeyEncryptValue = objAsyAlgm1.Encrypt(sessionKey, false);

共有1个答案

从景曜
2023-03-14

IV不需要保持安全。通常将IV预置到cyphertext中,并将它们一起发送。接收端使用传入消息的前128位作为IV,其余的作为Cyphertext处理。

当然,密钥需要在RSA(或等效)加密下单独发送。

 类似资料:
  • 问题内容: 我正在写一种加密会话密钥的方法。它需要这样做,以便可以通过已成功测试的其他程序解密密钥。解密程序无法更改。我受困的是使我的加密工作与解密例程保持一致。 首先让我给出解密例程。请记住,这不能改变: 这是我正在编写的加密例程。我生成base64编码的文本,但最终无法解密。值得注意的是,我已验证解密例程正确获取了加密例程的结果(两者之间没有握手问题)。 我真的被卡住了。任何帮助表示赞赏。谢谢

  • 我正在尝试将aes-128-cbc加密与openssl一起使用,我希望密钥需要32位。但是,我注意到当我输入密钥长度为18时,openssl不会给我错误。 但是,如果我在密钥后添加0,直到它是32位,我仍然会得到相同的结果。 有文档说OpenSSL给键添加了填充吗? 编辑:我需要在代码中重现此行为。我得到了密钥,但不能保证密钥是多少位数。

  • 我做了一个简单的文件加密/解密器。它将模式和要操作的文件作为参数。加密时,它生成随机字符串并使用该字符串加密文件。解密文件时,它会提示用户输入密码,并在解密时使用该密码。 我的问题是,解密时得到的不是明文,而是胡言乱语,尽管我小心翼翼地将相同的密钥写入输入。 非常感谢James K Polk提供的加密/解密代码!

  • 这是我的密码 抱歉,如果我的代码一团糟。

  • 我正在使用AES加密实现一个加密字符串的程序,并希望将我的“密钥”保存在一个文件中,而不是在源代码中硬编码。 但是,这给我带来了一个问题,我如何保护这个秘密密钥不被他人看到? 如果我要再次加密这个“密钥文件”,我将不得不再次处理同样的问题。 我该如何处理这些问题? 参考:https://wiki.sei.cmu.edu/confluence/display/java/MSC61-J.不要使用不安全

  • 我有一个PGP公钥加密的会话包,我想从中提取会话密钥,这样我就可以单独解密会话密钥。我正在使用BouncyCastle库,并像这样提取会话密钥: 其中session_key_enc.bin是二进制格式的加密会话密钥,private.pem是与我在GPG中用于加密数据的公钥相对应的私钥。在加密数据之前,我将RSA密钥对的公钥部分转换为PGP格式的密钥,并将其导入GPG。 当我运行OpenSSL命令时