有没有办法在php中使用交换加密? - java

我已使用此answer中的encryptdecrypt函数来实现使用带有Blowfish密码的Three-pass protocol传递消息。

我尝试使用可交换加密/解密。那是,

$tmp = encrypt($input, $key1);
$tmp = encrypt($tmp, $key2);
$tmp = decrypt($tmp, $key1);
$dec2 = decrypt($tmp, $key2);

但这行不通。我使用了一个键,而不是2个不同的键,它可以(必须!)。

因此,我使用这些功能的方式没有问题,但是我根本无法使用两个键来使用它。

难道我做错了什么?这是不可能的,还是还有另一种方法?

或者,有没有一种方法可以用Java实现呢?

编辑:对于不了解此过程的用户,三遍协议是一种无需发送密钥即可发送加密消息的方法。所以程序是

发件人使用key1加密并发送
接收方使用key2加密并发回
发件人使用key1解密并发回
接收方使用key2解密以获取原始消息

您可以看到密钥没有交换,但是消息仅以加密形式发送。这就是重点。

参考方案

在此线程中使用用户提供的XOR函数

Encrypt/decrypt with XOR in PHP

    function xor_this($string,$key) {

 // Our plaintext/ciphertext
 $text =$string;

 // Our output text
 $outText = '';

 // Iterate through each character
 for($i=0;$i<strlen($text);)
 {
     for($j=0;($j<strlen($key) && $i<strlen($text));$j++,$i++)
     {
         $outText .= $text{$i} ^ $key{$j};
         //echo 'i='.$i.', '.'j='.$j.', '.$outText{$i}.'<br />'; //for debugging
     }
 }  
 return $outText;
}

//The sender chooses a private encryption key s and a corresponding decryption key t. The sender encrypts the message m with the key s and sends the encrypted message E(s,m) to the receiver.
//The receiver chooses a private encryption key r and a corresponding decryption key q and super-encrypts the first message E(s,m) with the key r and sends the doubly encrypted message E(r,E(s,m)) back to the sender.
//The sender decrypts the second message with the key t. Because of the commutativity property described above D(t,E(r,E(s,m)))=E(r,m) which is the message encrypted with only the receiver's private key. The sender sends this to the receiver.

$senderkey=base64_encode('chicken');
$receiverkey=base64_encode('ardvark');

$itemwewanttoshare='hello darling';
echo'$itemwewanttoshare: '.$itemwewanttoshare.'<BR>';
$packet1=xor_this($itemwewanttoshare,$senderkey);
echo'$packet1: '.$packet1.'<BR>';

$packet2=xor_this($packet1,$receiverkey);
echo'$packet2: '.$packet2.'<BR>';

$packet3=xor_this($packet2,$senderkey);
echo'$packet3: '.$packet3.'<BR>';

$packet4=xor_this($packet3,$receiverkey);
echo'$packet4: '.$packet4.'<BR>';

你明白了

$itemwewanttoshare: hello darling
$packet1: 1W6 TS>
$packet2: hNwRVtq|ing
$packet3: 1=&M"TS>
$packet4: hello darling

编辑添加

我用base64作为简化的关键。使用变化更大的键,结果将更加复杂。
使用mcrypt_create_iv(40)创建您的密钥,您最终得到这样的结果

$senderkey='<²#H[Ô\´(µÑ/KÀ®"熺¥ç|Ëvr%O›eu$nºbe';
$receiverkey='Øh\5PÀKO[ù¬òZH‰•Ê¬h/¥nëk¾ðéíPÄ"Uü';

它将输出更改为

$itemwewanttoshare: hello darling
$packet1: T§ÞO'{§õ.®ÝF¥
$packet2: —?¶+¦6®½– þ
$packet3: «ý0Zpe¢ò"!<
$packet4: hello darling

编辑2

黄昏军团带来了一个好处。 $itemwewanttoshare应该由系统(程序)创建,而不是用户创建的项目。此方法可用于建立共享的加密密钥,发送方和接收方均可使用该共享密钥来加密进一步的通信。发件人将生成密钥,然后将其作为itemwewanttoshare,因此允许双方都知道加密密钥而无需直接传递它。

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

Java-向Servlet动态添加URL模式 - java

是否可以在运行时动态地将URL模式添加到Servlet?例如,当Servlet启动时,扫描文件夹中的注释,然后将这些URL模式注入到Servlet中?提供更多清晰度-在Servlet的init文件中,我要执行此操作(伪代码)// scan all the files in the package my.project.services // find all…

Java:我可以在Hashmaps中使用数组吗? - java

我可以在Hashmaps中使用数组吗?如果是这样,则声明这种哈希图的确切语法是什么?谢谢 参考方案 数组也是对象。甚至像int[]这样的原始数组。Map<String,String[]> map = new HashMap<String,String[]>();