我的加密方法有多安全?

时间:2011-11-30 10:23:06

标签: algorithm encryption cryptography

所以今天我正在做我有时做的事情,这只是为了好玩的程序,我决定制作自己的加密方法。我认为这是一个基本的流密码。我对密码学几乎一无所知,所以我不知道它有多安全。

以下是方法(在PHP中实现)

public function encrypt($data)
{
    $keylen = sizeof($this->key);
    $i=0;
    $current = 0; //Current offset for the cipher
    $ascii = utf8_decode($data);
    $output = "";
    for ($i=0;$i<strlen($ascii);$i++)
    {
        //Moves the cipher offset based on the key and the value of what is being
        //encrypted
        $current += ord($ascii[$i]) + $this->key[$i % $keylen];
        $current = $current % 256;
        $output .= chr($this->cipher[$current]);
        //Moves the cipher offset to the value of the subsequent cipher key
        $current = $this->cipher[($current+1)%256];
    }
    return $output;
}

说明

$this->cipher一个预先填充的数组,包含0-255之间的所有整数值,每个值只显示一次。 (实际上是一对一的功能,没有任何模式)

$this->key一个512字节的随机密钥(与密码数组不同,可能包含重复的值)

用于解密的密码和密钥必须与用于加密的密码和密钥明显相同才能检索明文。

解密方法

public function decrypt($data)
{
    $keylen = sizeof($this->key);
    $i=0;
    $offset = 0;
    $output = "";
    for ($i=0;$i<strlen($data);$i++)
    {
        $current = $this->r_cipher[ord($data[$i])];
        //Calculates the offset for the next iteration
        $next = $this->cipher[($current+1)%256];
        //Subtracts the calculated offset and key value
        $current -= $offset + $this->key[$i % $keylen];
        //Makes sure value is between 0 and 255
        $current = ($current+512)%256; 
        $output .= chr($current);
        $offset = $next;
    }
    return utf8_encode($output);
}

r_cipher只是密码函数的反函数

http://pastebin.com/KbvHZnD1使用的算法示例,给出了示例密钥和密码以及几个示例

4 个答案:

答案 0 :(得分:2)

我敢说,如果[you] know next to nothing about cryptography,您发明的加密方法根据定义是不安全的。它可能会阻止普通人,但不是密码学专家或经验丰富的黑客。

答案 1 :(得分:2)

你的方法有点类似于凯撒密码。你应该看一下Caesar密码的维基百科页面的Breaking the cipher部分

答案 2 :(得分:1)

很难说加密算法的安全性如何。我想有一些标准程序,如CMVP来验证算法。

该算法必须对某些黑客论坛开放,如果有的话,必须在那里证明其实力。

答案 3 :(得分:1)

由于它是一个流动的密码,密钥重用可能很成问题。


$output .= chr($this->cipher[$current]);
$current = $this->cipher[($current+1)%256];

这意味着此字符后面的current状态只是输出字节的排列。

因此,每当看到两个相隔512个字节的倍数的值时,具有相同的前一个输出,并且该位置的输入相同,输出将是相同的。这与理想的密码属性明显不同。


如果对所有256进行编码,则获取cypher的内容,而不是索引上的偏移量。在此之后,你将减少到一个512字节的凯撒密码。

结合这两个弱点,您可以在几百KB的已知纯文本上获得完整的密钥恢复。