2015-10-22 82 views
5

我被要求通过创建一个新程序来加密密码,我在想什么是使用位来改变我的输入键的每个字符与显然不相关的字符,所以我写了这个函数:有什么方法可以扭转这种按位功能?

(I使用PHP代码):

function CBS($digits, $n_times) { 
    $mask = 0x7FFFFFFF; 
    $digits = intval($digits); 
    if($n_times > 0) { 
     $digits = ($digits<<$n_times%32) & (($digits>>(32-$n_times%32)) & ($mask>>(31-$n_times%32))); 
    }elseif($n_times < 0) { 
     $n_times = abs($n_times); 
     $digits = (($digits>>$n_times%32) & ($mask >> (-1+$n_times%32))) | ($digits<<(32-$n_times%32)); 
    } 
    return decbin($digits); 
} 

当然,我加密我的密码后,我应该能够解密它。

有没有办法做到这一点?

你不需要给我写代码来完成它,如果你能用单词向我解释它,那将是非常棒的。

+0

我也会散列,但我的老师问我加密,所以我想我必须这样做...... –

+0

它可能是您的认证规范的一部分,所以我很难责怪你,尽管审查委员会对你做的任何证明都不应该在密码范围内教这个。 – cybermonkey

+0

那么,我们谁会创造最安全的算法将得到最好的印记,所以我正在努力做到最好! –

回答

1

“当然,在我加密我的密码后,我应该可以解密它。” - 从根本上错误!正确的加密函数(即散列函数)不应该具有反向函数。非常简单的识别算法:
1.用户通过使用加密函数(entered_hash = F(密码))进入密码
2.从密码获取散列
3.比较entered_hash与right_hash_stored
NEVER存储密码,唯一哈希值!

我想,如果你想要你的加密函数有反向,它应该由具有反向的函数组成,所以AND和OR不是这样,而是ROT和XOR。 所以你需要的 - ROT/XOR的序列(对于XOR掩码,你可以使用previos squense步骤的加密值,在这种情况下,它必须保存)

+0

是的,我完全知道它不应该被加密,以及如何验证是否输入密码与t相匹配他舍去了一个,但由于某种原因,这项练习一旦加密就需要将其撤销。 当然这不是一个专业的工作。 –

+0

随着ROT你的意思是循环移位? –

+0

是:例如有一个列表[2,3] - 每个值表示循环移位的数字(让它左移)与下一个XOR,即数字到移位的XOR移位结果。加密步骤: –

相关问题