Kry*_*hic -6 c# security encryption
我在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)
Run Code Online (Sandbox Code Playgroud)
然后,我们有了新的字节值,它可以是一个数字,一个字母(都是大写的),一个符号,甚至是不可打印的字符.当打印到文件时,消息"这只是一个测试".好像:
这是目前的代码:
/**
* 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 );
}
}
Run Code Online (Sandbox Code Playgroud)
我个人觉得它很安全.您不仅需要算法,还需要准确的密码,以及用于解密加密消息的种子/盐.我只需要知道你们的想法,我在这里错过了什么吗?
想测试你的功夫?试着解决这个问题: 如果可以,请告诉我
移位密码(其中凯撒密码是变体)是最不安全的密码类型.
让我们假设有人意识到你正在使用某种形式的移位密码.经典移位密码只有26个可能的密钥(对应于拉丁字母表中的26个字母).您的密钥集较大,因为您的潜在结果字符域是整个字符集(ASCII,UTF-8,Unicode或其他).即使您使用的是unicode,也只有大约一百万个可能的密钥.你用来移动的整数可能比这大 - 比如一百万和一个 - 但是你得到的效果就像你的钥匙只是一个一样.如果有人强行加密您的加密文本,这将花费时间来解密.
此外,如果解密者推断解密文本形成了连贯的可读单词,这将大大减小结果字符集的大小; 解密算法不必考虑所有可能的unicode(或你使用的任何字符集)值,只需考虑人类可理解的值.
您可能会争辩说,接近这个问题的人可能没有意识到您正在使用移位密码并浪费时间试图找出您正在使用的内容,但数百年的密码学研究已将移位密码标记为最常见的算法之一存在.任何值得他/她/他的盐的解密者都会尝试这种方法.
| 归档时间: |
|
| 查看次数: |
499 次 |
| 最近记录: |