C# 我的自定义加密算法有多安全?

C# 我的自定义加密算法有多安全?,c#,security,encryption,C#,Security,Encryption,我用C语言创建了自己的非常简单的加密算法,我想知道它到底有多安全。我把算法称为SBC,它代表简单的字节密码。从本质上讲,它的工作原理类似于凯撒密码,只是我增加了整数,即相关字节的值,而不是字母的值 我决定这么做有几个原因。首先,我想要一个能提供精确的1:1大小比的算法。换句话说,我希望输出加密长度等于输入文本的长度,而不增加任何长度。我还希望能够使用我想要的任何字母、数字、字符等,而不必使用任何大写字母的密码,这是本地凯撒密码无法做到的。我希望输出的也是大量无法打印的字符,有点像二进制文件。我也

我用C语言创建了自己的非常简单的加密算法,我想知道它到底有多安全。我把算法称为SBC,它代表简单的字节密码。从本质上讲,它的工作原理类似于凯撒密码,只是我增加了整数,即相关字节的值,而不是字母的值

我决定这么做有几个原因。首先,我想要一个能提供精确的1:1大小比的算法。换句话说,我希望输出加密长度等于输入文本的长度,而不增加任何长度。我还希望能够使用我想要的任何字母、数字、字符等,而不必使用任何大写字母的密码,这是本地凯撒密码无法做到的。我希望输出的也是大量无法打印的字符,有点像二进制文件。我也希望它能快一点。非常快。我目前的算法能够在比我关心的更少的时间内完全加密哈克贝利·费恩。是的,它只需要几分之一秒

但真正的问题现在摆在桌面上……我的算法有多安全?有没有办法测试它?它有什么明显的缺陷吗?请允许我首先解释它是如何工作的,然后我将向您展示代码

算法其实很简单,几乎太简单了。我们从获取我们想要的任意字符串开始,假设在这种情况下,我们选择Stackoverflow。然后,我们选择一个密码,该密码将在互联网上使用,最后选择一个单一的种子/盐值。让我们做31,因为它是我最喜欢的数字

我的算法首先循环遍历字符串,获取每个字母并使用其字节值+密码字节值的当前字母索引+种子整数值

作为一个模型,它看起来像:

Input Byte | Password Byte | Seed Value|
    45     +       18      +     31    =  94(this number rolls around for byte if it exceeds 255)
然后,我们有了新的字节值,它可以是数字、字母(大写与否)、符号,甚至是无法打印的字符。当打印到一个文件时,该消息只是一个测试。看起来像:

以下是目前的代码:

    /**
     * Simple Byte Cipher "SBC"
     * Created by Gordon Kyle Wallace, "Krythic".
     */
    public static class SimpleByteCipher
    {

        public static byte[] EncryptStringToByteArray( string data , string password , uint seed)
        {
            byte[] bytes = Encoding.ASCII.GetBytes( data );
            byte[] passwordBytes = Encoding.ASCII.GetBytes( password );
            int passwordShiftIndex = 0;
            for( int i = 0; i < bytes.Length; i++ )
            {
                bytes[ i ] = ( byte )( bytes[ i ] + passwordBytes[ passwordShiftIndex ] + seed );
                passwordShiftIndex = ( passwordShiftIndex + 1 ) % passwordBytes.Length;
            }
            return bytes;
        }

        public static string DecryptByteArrayToString( byte[] data , string password , uint seed)
        {
            byte[] bytes = data;
            byte[] passwordBytes = Encoding.ASCII.GetBytes( password );
            int passwordShiftIndex = 0;
            for( int i = 0; i < bytes.Length; i++ )
            {
                bytes[ i ] = ( byte )( bytes[ i ] - passwordBytes[ passwordShiftIndex ] - seed );
                passwordShiftIndex = ( passwordShiftIndex + 1 ) % passwordBytes.Length;
            }
            return Encoding.ASCII.GetString( bytes );
        }
    }
我个人觉得它很安全。您不仅需要算法,还需要准确的密码,以及用于解密加密消息的种子/盐。我只想知道你们在想什么,我是不是遗漏了什么

想试试你的功夫吗?尝试破解这个问题:

凯撒密码是其变体的移位密码是最不安全的密码类型之一

假设有人意识到你在使用某种形式的移位密码。经典的移位密码只有26个可能的键,对应于拉丁字母表中的26个字母。您的密钥集更大,因为您的潜在结果字符域是整个字符集ASCII、UTF-8、Unicode或其他字符集。即使您使用的是unicode,也只有大约一百万个可能的键。用来移位的整数可能比这个大,比如说一百万加一,但是你得到的效果和你的键仅仅是一一样。如果有人对你的加密文本进行暴力破解,这根本不需要时间来解密


此外,如果解密者推断解密后的文本形成了连贯的可读字,这将大大减少结果字符集的大小;解密算法不必考虑所有可能的Unicode或任何使用值的字符集,只能考虑对人类理解的字符集。


你可能会争辩说,处理这个问题的人可能没有意识到你在使用移位密码,并浪费时间试图弄清楚你在使用什么,但数百年的密码学研究已经将移位密码标记为最常见的算法之一。任何称职的解密者都会立即尝试这种方法。

你错过了大约300年的加密研究。当有许多经过良好测试的算法实现可供使用时,为什么要实施自定义加密方案?因此答案是:很可能根本不安全。只要有足够的加密文本,就很容易破解。。。。如果有足够的密文,这很容易破解。基本上它仍然是一个…@Krythic:任何大于十六进制0x7F的字节都被解码为Unicode问号?。如果任何输入字符的代码点是>127,则不会从加密解密回程中得到相同的字符串。解密算法不必考虑所有可能的Unicode或任何使用值的字符集,而只能是那些对人类理解的字符集。我可以看出这是一个弱点,是的,你是对的。我的密钥集是56+所有其他符号,如感叹号、逗号等。