代码之家  ›  专栏  ›  技术社区  ›  Icemanind

使用AES的C#私有/公共加密

  •  2
  • Icemanind  · 技术社区  · 15 年前

    我正在试图找出如何使公开/私人密钥是AES加密。我希望能够像这样使用它:

    byte[] BytesToEncrypt = { 0x01, 0x02, 0x03, 0x04, 0x05 };
    byte[] PublicKey;
    byte[] PrivateKey;
    byte[] EncryptedBytes;
    byte[] UnencryptedBytes;
    
    PrivateKey = CreatePrivateKey();
    PublicKey = CreatePublicKey(PrivateKey);
    EncryptedBytes = EncryptBytes(PrivateKey);
    // This line should return unencrypted bytes
    UnencryptedBytes = UnencryptBytes(EncryptedBytes, PrivateKey);
    // This line should also return the unencrypted bytes
    UnencryptedBytes = UnencryptBytes(EncryptedBytes, PublicKey);
    

    如何实现这样的功能?我见过公共/私有加密,但我见过的所有示例似乎都使用RSA加密。我想用AES。这可能吗?

    2 回复  |  直到 15 年前
        1
  •  7
  •   Mark Byers    15 年前

    AES是一种对称密钥加密算法,因此谈论公共和私有AES密钥是没有意义的。如果您的AES密钥是公共的,则根本没有安全性。

    如果愿意,可以使用AES加密对RSA公钥进行加密,但这是不必要的,因为这不是需要保密的。

    您可以使用AES加密来加密RSA私钥。这可能是有用的,如果你想密码保护你的钥匙,使如果你的电脑被盗,他们不能使用你的钥匙。

    您还可以使用非对称加密将对称密钥传输给另一方,然后使用对称加密与另一方通信。 TLS 使用这个原则。它可能很有用,因为对称算法可以更快地计算,但是以纯文本形式向某人发送对称密钥是不安全的,因此需要使用非对称加密来保证对称密钥的安全。

        2
  •  2
  •   userx    15 年前

    虽然AES加密是对称的,但我假设您的目标是加密数据(无论出于何种原因,都必须使用AES),将数据提供给其他人,允许他们读取数据,但前提是他们拥有您的公钥。

    您可以考虑以下工作流:

    1. 生成AES加密密钥。
    2. 使用AES加密密钥加密数据。
    3. 使用私钥加密AES加密密钥。
    4. 将AES加密的数据、公钥和AES密钥按私钥加密的方式分发。

    这类似于SSL所做的(不完全是因为存在一个握手过程,数据使用公钥而不是私钥加密),但可能满足您的需要。

    此工作流确保只有在有人拥有您的公钥时才能发现您的AES密钥,但如果他们拥有正确的AES密钥,则不会阻止有人用其他数据替换您的原始数据。这就是公钥/私钥数据签名的用途。