不使用密钥的加密算法

时间:2009-06-04 17:36:40

标签: c# encryption

我需要一种不使用密钥的简单加密算法。

你们推荐哪些人?

如果我使用表单身份验证的内置加密方法怎么样? (我忘了它的方法/命名空间。)

9 个答案:

答案 0 :(得分:16)

每个对称加密方案都有一个密钥。如果您正在寻找不管理密钥的加密方案,您可以查看在.NET(2.0及更高版本)中公开的Data Protection API作为System.Security.Cryptography.ProtectedData类。它使用机器的凭证或(更好的)用户作为加密密钥,对任意数据进行对称加密。

byte[] plaintextBytes = GetDataToProtect();
byte[] encodedBytes = ProtectedData.Protect(plaintextBytes
                                            , null
                                            , DataProtectionScope.CurrentUser);

有关详细信息,请参阅我的其他答案here

答案 1 :(得分:7)

加密的东西之外的东西需要用来进行加密,只是因为你需要稍后解密它。这个外在的东西是关键。没有密钥就没有有用的加密方法。只有散列。

答案 2 :(得分:5)

你所谓的加密只是模糊处理。即便如此,它仍然是加密,其中密钥嵌入在算法中。在你得到任何合理的答案之前,你必须至少提供一个简单的用例。

答案 3 :(得分:3)

rot13使用已在算法中的密钥。这是我认为你最接近的。

答案 4 :(得分:3)

关于没有关键=没有加密的谈判......

也许你真正追求的是自动和安全的密钥创建和交换,没有用户交互。这可以通过使用非对称加密来完成,它的工作原理如下:

场景:A需要向B发送消息,并希望确保没有中间人可以阅读该消息。

A和B发起这样的对话:

  1. A要求B代表B的公钥。
  2. B生成公钥/私钥对,并将公钥发送给A.
  3. A使用公钥加密消息,并发送消息。
  4. B接收消息,并使用其私钥对其进行解密。
  5. 这是有效的,因为消息是使用公钥加密的,只能使用相应的私钥解密。所以公钥不一定要保密。如果中间人拿起公钥,他就不能用它来解密信息。

    如果您使用google进行非对称加密,您可能会发现大量有关此内容的信息......

答案 5 :(得分:2)

无密码加密的问题在于,一旦它被破坏,它就会被所有人破坏。以MicroSoft Script Encoder为例。一旦有人知道如何反转加密和published it,加密就会被所有人破坏(请参阅评论,了解在这种情况下这不会像听起来那么糟糕。)

话虽如此,您可以使用任何键控算法并保持密钥的秘密,您将获得相同(不良)的效果。

答案 6 :(得分:2)

从根本上说,密码是一种让爱丽丝告诉鲍勃的一种方式,即使她无意中听到夏娃也无法弄明白。

这意味着密文需要有一些方法来区分鲍勃和夏娃。

通常,这是关键。如今,它可以是Alice给Bob而不是Eve以某种方式提供的对称密码密钥,或者是Bob广播的非对称密码密钥,以便任何人都可以为他加密只有他能够读取的消息(通常用作传输的方式)对称密码密钥)。

算法可以作为密钥,但算法分配和保密非常不方便。最好只使用标准密钥。

如果你愿意指望Bob有动力去阅读这条消息而且Eve不是,那么你可以简单地对明文进行模糊处理。例如,你可以通过压缩文件来做到这一点。夏娃不能只读它,她必须解压缩它。这通常是为了防止夏娃意外地读取适合鲍勃的东西,假设夏娃是光荣的,但可能会偶尔出错。我想到的例子是CVS密码文件;它会阻止一个系统管理员一眼就看到密码,但如果有人真的想读它,那就是“rot13的道德等价物”。

所以,为了给你一个有用的答案,我们需要知道你想用它做什么。数据有多敏感?有多大可能陷入不友好之手?你希望谁能阅读它?

BTW,永远不要推出自己的加密技术。这真的很容易出错,很难注意到它。使用标准算法的标准实现。

答案 7 :(得分:1)

如果您真的经过混淆,可以使用PasswordDeriveBytes类从密码创建密钥。然后使用例如密钥AES。

答案 8 :(得分:0)

(如果我错了,请纠正我)没有钥匙就没有加密。

但也许你想要这样的东西

    static readonly string PasswordHash = "P@@Sw0rd";
    static readonly string SaltKey = "S@LT&KEY";
    static readonly string VIKey = "@1B2c3D4e5F6g7H8";   


    public static string Encrypt(string plainText)
    {
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

        byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash, Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256 / 8);
        var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.Zeros };
        var encryptor = symmetricKey.CreateEncryptor(keyBytes, Encoding.ASCII.GetBytes(VIKey));

        byte[] cipherTextBytes;

        using (var memoryStream = new MemoryStream())
        {
            using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
            {
                cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                cryptoStream.FlushFinalBlock();
                cipherTextBytes = memoryStream.ToArray();
                cryptoStream.Close();
            }
            memoryStream.Close();
        }
        return Convert.ToBase64String(cipherTextBytes);
    }
    public static string Decrypt(string encryptedText)
    {
        byte[] cipherTextBytes = Convert.FromBase64String(encryptedText);
        byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash, Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256 / 8);
        var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.None };

        var decryptor = symmetricKey.CreateDecryptor(keyBytes, Encoding.ASCII.GetBytes(VIKey));
        var memoryStream = new MemoryStream(cipherTextBytes);
        var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
        byte[] plainTextBytes = new byte[cipherTextBytes.Length];

        int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
        memoryStream.Close();
        cryptoStream.Close();
        return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount).TrimEnd("\0".ToCharArray());
    }