我在C#中创建了自己非常简单的加密算法,我想知道它到底有多安全。我将算法称为“SBC”,它代表“Simple Byte Cipher”。本质上,它的工作方式类似于Caesar Cipher,除了我增加整数(相关字节的值)而不是字母。
我决定这样做有几个原因。首先,我想要一种能够提供精确1:1大小比例的算法。换句话说,我希望输出加密长度等于输入文本的长度而没有任何增长。我还希望能够使用我想要的任何字母,数字,字符等,而无需使用密码制作大写字母,这是Caesar Cipher本身无法做到的。我希望输出也大部分是一堆不可打印的字符,有点像二进制文件。我也希望它快。非常快。我现在的算法能够在更短的时间内完全加密Huckleberry Finn,甚至可以表达(是的,它只是片刻)。
但现在真正的问题是在桌面上......我的算法有多安全?有没有办法可以测试它?它有任何明显的缺陷吗?首先让我解释它是如何工作的,然后我会告诉你代码。
算法实际上非常简单,几乎太简单了。我们首先采用我们想要的任意字符串,让我们说在这种情况下我们选择“Stackoverflow”。然后我们选择一个密码,它将是“Cats Rule the Internet”,最后是一个种子/盐值。我们做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 );
}
}
我个人觉得它很安全。您不仅需要算法,还需要准确的密码,以及用于解密加密消息的种子/盐。我只需要知道你们的想法,我在这里遗漏了什么吗?
想测试你的功夫?试着破解这个: Crack me if you can
答案 0 :(得分:5)
移位密码(其中凯撒密码是一种变体)是最不安全的密码类型。
让我们假设有人意识到你正在使用某种形式的移位密码。经典移位密码只有26个可能的密钥(对应于拉丁字母中的26个字母)。您的密钥集较大,因为您的潜在结果字符域是整个字符集(ASCII,UTF-8,Unicode或其他)。即使您使用的是unicode,也只有大约一百万个可能的密钥。你用来移动的整数可能比这大 - 比如一百万和一个 - 但是你得到的效果就像你的钥匙只是一个一样。如果有人要强行加密您的加密文本,那么根本不需要时间来解密。
此外,如果解密者推断解密的文本形成了连贯的,可读的单词,这将大大减小结果字符集的大小;解密算法不必考虑所有可能的unicode(或你使用的任何字符集)值,只需考虑人类可理解的值。
你可能会争辩说,接近这个问题的人可能没有意识到你正在使用移位密码并且浪费时间试图弄清楚你正在使用什么,但数百年的密码学研究已经将移位密码标记为最重要的密码之一存在的普通算法。任何值得他/她/他的盐的解密者都会尝试这种方法。