我想使用关键字加密句子。例如句子"我爱你"关键字" LOVE"将成为" T ZJZP MJY"。
Words = I LOVE YOU
Keyword = LOVE
Encrypt = T ZJZP MJY
Letter" A"将从字母" L"开始因为" L"是关键字的开头,它将在字母“#34; I"指示字母的字样" T"。然后写信" A"将从字母" O"开始关键字,以便" L"这些词将是" Z"。然后写一封信" A"将从" V"开始得到的关键词" J"。
关键字应该在句子中。
试过这个,但卡住了。
$word = "I LOVE YOU";
$keyword = "LOVE";
$letters = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
$keyword = str_split($keyword);
$word = str_split($word);
$newWord = "";
for($x=0; $x<26 ; $x++){
for($y=0; $y<sizeof($keyword); $y++){
}
}
答案 0 :(得分:2)
我不确定StackOverflow是否是正确的交换,但无论如何我会回答它,你正在寻找的是OTP方法,更具体地说是滚动的OTP方法(意思是它)重复键/键以考虑输入的全长。
最常见的OTP方法是XOR,我先给你看一下代码,然后再解释一下
function OTP($input, $pad) {
$inputlen = strlen($input);
$padlen = strlen($pad);
$inputbytes = unpack("C*", $input); //Unpack C* will convert a string into a byte array, such as 'abc' to Array(0x61, 0x62, 0x63)
$padbytes = unpack("C*", $pad);
$output = "";
for($i = 0; $i < $inputlen; $i++) //Loop through the input string
$output .= chr($inputbytes[$i + 1] ^ $padbytes[$i % $padlen + 1]);
return $output;
}
使用带有unpack
选项的C*
获取每个字符串的字节数组后,您将循环输入字符串,通过相同位置的填充字符对^
进行异或运算(mod %
长度)。 $i % $padlength
确保for循环永远不会循环到大于字符串长度的索引,例如,如果你有一个长度为3的字符串'ABC'和for
循环循环到3会导致索引超出边界错误,但是如果$i % <the length of the string>
循环循环到3时for
计算将等于0,因为3 % 3 = 0
和{{1 }}
使用unpack时,绝对必须在索引中加1,因为字节数组不零索引。
有趣的事实:正确使用此加密是完全牢不可破的