生成可重复的“乱码”;从一个给定的字符串

本文关键字:一个 字符串 乱码 | 更新日期: 2023-09-27 18:02:26

我正在寻找的东西,有点像一个散列算法,除了我希望它生成一个数组的预定义长度给定任何任意字符串。例如:

任意种子:

"熵"

所需长度:

100个来自种子的可复制性状。

可能输出: efvrll9ugkolblpscba2zippon5qem2q0fsepmurqu2nssvsxwaqkgcbjm0naeuoaatgwapj1afbt3hxawnonuxcksby7ewcptoga

生成的输出在任何情况下都需要加密安全,生成的字符无关紧要(它们可以是任何字符,甚至是不可打印的字符)。我唯一的要求是,在相同的种子下,输出是完全可复制的。有谁能给我一些建议吗?

生成可重复的“乱码”;从一个给定的字符串

我决定使用我自己的伪哈希,它工作得很好。这是我想出的代码;希望它能在未来帮助到其他人:

        public static byte[] HashString(string seed, int length)
        {
            char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".ToCharArray();
            byte[] hash = new byte[length];
            byte lastHash = 0;
            for (int i = 0; i < length; i++)
            {
                hash[i] = (byte)alphabet[(seed[(i % seed.Length)] ^ (i + lastHash)) % alphabet.Length];
                lastHash = hash[i];
            }
            return hash;
        }

这是一种无需创建自己的散列的方法:

var myString = "Entropy";
byte[] saltBytes = Encoding.ASCII.GetBytes("someSaltIWant");
var dBytes = new System.Security.Cryptography.Rfc2898DeriveBytes(myString, saltBytes).GetBytes(75);
var gibString = Convert.ToBase64String(dBytes);
Console.WriteLine(gibString);
// Always prints MVqAYJbmkxgQ4FdTD+a7/BlfZZLBVDXpsAAYtMuJ4aU5iejD+sB3tHqgSRoCg2KD1vnpI5eXhZa6vWvpOuM8dH8aOi1/zKMXuu4a

即使你对安全性不感兴趣,我认为使用这种散列可以更容易地达到你想要的100个字符。使用MD5或任何SHA,您将简短。

如果你想要一个不可打印的字符串,你可以这样做:

var dBytes = new System.Security.Cryptography.Rfc2898DeriveBytes(myString, strBytes).GetBytes(100);
string ugly = Encoding.ASCII.GetString(dBytes);