ホームページ >バックエンド開発 >PHPチュートリアル >php3des暗号化問題満点、JAVA対応

php3des暗号化問題満点、JAVA対応

WBOY
WBOYオリジナル
2016-06-23 14:21:201131ブラウズ

3des

相手が提供したキー
56781234D56F012BCD5E701A3CDD6709

同じ暗号化を実装するには PHP を使用する必要があり、結果は 16 進数に変換されます

つまり、0000000 などの 8 桁の場合0
暗号化後、 16進数の16ビットに変換されます

12345678を暗号化するためのソフトウェアが提供されています
まずbin2hexを使用して12345678を16進数の文字列に変換すると、結果は3132333435363738になります
次に暗号化すると、結果はB2A85CF088D9FF03になります
写真に示すように:


次に、PHP を使用して、暗号化の結果と同じものを実装する必要があります。何度も試しましたが、正しくできません。コードを投稿してください
JAVA 暗号化コードが添付されています:
package com.huateng.crypto.des;import com.huateng.crypto.CryptoException;import java.io.PrintStream;import java.security.InvalidAlgorithmParameterException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.spec.InvalidKeySpecException;import java.util.Arrays;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESedeKeySpec;import javax.crypto.spec.IvParameterSpec;public class TripleDesTool{  public static byte[] decrypt(byte[] input, byte[] key)    throws CryptoException  {    byte[] decryptedData;    try    {      SecretKeyFactory keyFactory = null;      try {        keyFactory = SecretKeyFactory.getInstance("DESede");      } catch (NoSuchAlgorithmException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      SecretKey secretKey = null;      try {        secretKey = keyFactory.generateSecret(new DESedeKeySpec(key));      } catch (InvalidKeySpecException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      Cipher cipher = null;      try {        cipher = Cipher.getInstance("DESede/CBC/NoPadding");      } catch (NoSuchPaddingException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      catch (NoSuchAlgorithmException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      IvParameterSpec iv = new IvParameterSpec(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 });      try      {        cipher.init(2, secretKey, iv);      } catch (InvalidAlgorithmParameterException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      try      {        decryptedData = cipher.doFinal(input);      } catch (BadPaddingException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      catch (IllegalBlockSizeException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      catch (IllegalStateException ex) {        throw new CryptoException(ex.getMessage(), ex);      }    }    catch (InvalidKeyException ex) {      throw new CryptoException(ex.getMessage(), ex);    }    return decryptedData;  }  public static byte[] encrypt(byte[] input, byte[] key)    throws CryptoException  {    int len = (input.length / 8 + (input.length % 8 == 0 ? 0 : 1)) * 8;    byte[] plainData = new byte[len];    byte[] encryptedData = new byte[8];    Arrays.fill(plainData, 32);    System.arraycopy(input, 0, plainData, 0, input.length);    try    {      DESedeKeySpec dks = null;      dks = new DESedeKeySpec(key);      SecretKeyFactory keyFactory = null;      try {        keyFactory = SecretKeyFactory.getInstance("DESede");      } catch (NoSuchAlgorithmException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      SecretKey secretKey = null;      try {        secretKey = keyFactory.generateSecret(dks);      } catch (InvalidKeySpecException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      Cipher cipher = null;      try {        cipher = Cipher.getInstance("DESede/CBC/NoPadding");      } catch (NoSuchPaddingException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      catch (NoSuchAlgorithmException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      IvParameterSpec iv = new IvParameterSpec(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 });      try      {        cipher.init(1, secretKey, iv);      } catch (InvalidAlgorithmParameterException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      try      {        encryptedData = cipher.doFinal(plainData);      } catch (BadPaddingException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      catch (IllegalBlockSizeException ex) {        throw new CryptoException(ex.getMessage(), ex);      }      catch (IllegalStateException ex) {        throw new CryptoException(ex.getMessage(), ex);      }    }    catch (InvalidKeyException ex) {      throw new CryptoException(ex.getMessage(), ex);    }    return encryptedData;  }  public static void main(String[] args)    throws Exception  {    byte[] input = { 1, -100, 24, 68, -33, -12, -45, -4 };    for (int i = 0; i < input.length; i++) {      System.out.print(input[i] + ",");    }    System.out.println("");    System.out.println("");    byte[] output1 = decrypt(input, new byte[] { -118, -59, -33, 70, 60, 29, -123, 70, 35, 53, -85, -88, 90, 20, -3, 111, -118, -59, -33, 70, 60, 29, -123, 70 });    for (int i = 0; i < output1.length; i++) {      System.out.print(output1[i] + ",");    }    System.out.println("");  }}



ありがとうございます!




ディスカッション(解決策)に返信

1階を所有し、オンラインで待機してください!アイデアのある方は大歓迎です


誰がこれに 100 点を与えるでしょうか?
//echo $key;exit ;
$iv = パック('H*','0');

関数 fmt3DESEx($s){
$key = '56781234D56F012BCD5E701A3CDD670956781234D56F 012B';キー); $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
// $iv = Pack('H10',"0102030405060708"); // c# と同様 new byte[]{1,2,3,4, 5,6,7,8}
$iv = Pack('H10','000000000');
mcrypt_generic_init($td, $key, $iv);
$encrypted_data = mcrypt_generic($td, $s); McRypt_generic_deinit($ td);

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。