号称是不可破解的一次一密

尴尬虽然看上去是一次一密,但是可以用一定的分析方法破解,比如每个字符^0~255在找合适的含义~~,下面代码的意义我估计在于,当我们构架n层加密体系的时候始终有可变层存在,比如这里的key可当作私钥,之类的~~,不过在现实应用中发现(char)character这会产生空字符,如果在内存中没啥,但保存下来就可能会丢失,所以如果可能换成16进制的数据可好嘿嘿。

using System.Text;
using System.Security.Cryptography;

class OTP_XOR
{
    static void Main(string[] args)
    {
        Console.Write("Enter plaintext: ");
        StringBuilder plaintext = 
            new StringBuilder(Console.ReadLine());
        
        RandomNumberGenerator rng = 
            new RNGCryptoServiceProvider();
        byte[] key = new Byte[plaintext.ToString().Length];
        

        //--下面这里我修改了下,首先保证非0数据出现其次保证和原始数据相同咯- -看过原文的不要误会哈~~
        rng.GetNonZeroBytes(key);
        
         StringBuilder ciphertext = 
            EncryptDecrypt(plaintext, key);
        Console.WriteLine("ciphertext: {0}", 
            ciphertext);

        StringBuilder recoveredplaintext = 
            EncryptDecrypt(ciphertext, key);
        Console.WriteLine("recovered plaintext: {0}",
            recoveredplaintext);

        Console.Read();
    }
    
    /**//// <summary>
    /// 加密函数-可以反复用-这个函数的幽默点就在--^这里由于[原始数据^随机加密数据^随机加密数据=原始数据]
    /// </summary>
    /// <param name="data_in"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    static StringBuilder EncryptDecrypt(
        StringBuilder data_in, 
        byte [] key)
    {
        StringBuilder data_oput = 
            new StringBuilder(data_in.ToString());
        for (int index=0; index<data_in.Length; index++)
        {
            int character = 
                ((int)data_in[index] ^ key[index]);
            data_oput[index] = (char)character;
        }
        return data_oput;
    }
}
原文地址:https://www.cnblogs.com/angellapples/p/3333958.html