我应该如何将这个JavaDES程序转换为PHP?

我应该如何将这个JavaDES程序转换为PHP?,java,php,encryption,des,Java,Php,Encryption,Des,我有一个使用java的DES算法,现在我需要将这个java程序转换为php,我不知道javacipher.init方法的第三个参数SecureRandom,所以我使用我的php DES程序来加密字符串,但是我用java DES得到了不同的结果 以下是我的Java DES: public static String encode(String srcStr) { if (srcStr == null) return null; String dst = null;

我有一个使用java的DES算法,现在我需要将这个java程序转换为php,我不知道java
cipher.init
方法的第三个参数
SecureRandom
,所以我使用我的php DES程序来加密字符串,但是我用java DES得到了不同的结果

以下是我的Java DES:

public static String encode(String srcStr) {
    if (srcStr == null)
        return null;
    String dst = null;
    byte[] result = encrypt2(srcStr.getBytes(), "h43au76U");
    if (result == null)
        return null;
    System.out.println(result);
    dst = byte2HexStr(result, result.length);
    return dst;
    }

 private static final char[] mChars = "0123456789ABCDEF".toCharArray();


 public static String byte2HexStr(byte[] b, int iLen) {
        if (b == null)
            return null;
        StringBuilder sb = new StringBuilder();
        for (int n = 0; n < iLen; n++) {
            sb.append(mChars[(b[n] & 0xff) >> 4]);
            sb.append(mChars[b[n] & 0xf]);
        }
        return sb.toString().trim().toUpperCase(Locale.US);
        }



 private static byte[] encrypt2(byte[] datasource, String password) {
        byte[] is;
        try {
            SecureRandom random = new SecureRandom();
            DESKeySpec desKey = new DESKeySpec(password.getBytes("UTF-8"));
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            javax.crypto.SecretKey securekey
            = keyFactory.generateSecret(desKey);
            Cipher cipher = Cipher.getInstance("DES");
            cipher.init(1, securekey, random);
            is = cipher.doFinal(datasource);
        } catch (Throwable e) {
            e.printStackTrace();
            return null;
        }
        return is;
        }

我得到了不同的结果,为什么?我不知道SecureRandom是否是
iv

始终使用完全限定的密码字符串。
Cipher.getInstance(“DES”)可能会产生不同的密码。它很可能导致添加“
”DES/ECB/pkcs5p”
,但不一定非得如此。如果它发生更改,您将失去不同JVM之间的兼容性

要在PHP中实现与Java的兼容性,需要使用ECB模式而不是CBC模式,并应用PKCS#5填充(与PKCS#7填充相同)。显示了该填充的实现。您只需使用正确的块大小,即DES为8


切勿使用。它是确定性的,因此在语义上不安全。您至少应该使用随机模式,如或。最好是对密文进行身份验证,这样就不可能进行类似的攻击。这可以通过诸如GCM或EAX之类的经过身份验证的模式来实现,也可以通过一个方案来实现


静脉注射必须是不可预测的(阅读:随机)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定以前何时发送相同的消息前缀。IV不是秘密,所以你可以把它和密文一起发送。通常,它只是在密文前加上前缀并在解密前切掉。

始终使用完全限定的密码字符串。
Cipher.getInstance(“DES”)可能会产生不同的密码。它很可能导致添加“
”DES/ECB/pkcs5p”
,但不一定非得如此。如果它发生更改,您将失去不同JVM之间的兼容性

public static function encryptDes($data, $key)
{
     $paddedData = static::pad($data);
     $opts = OPENSSL_ZERO_PADDING | OPENSSL_RAW_DATA;
     return strtoupper(bin2hex(openssl_encrypt($paddedData, 'DES-ECB', $key, $opts)));
}

public static function decryptDes($data, $key)
{
    $data = hex2bin($data);
    $opts = OPENSSL_ZERO_PADDING | OPENSSL_RAW_DATA;
    return static::unpad(openssl_decrypt($data, 'DES-ECB', $key, $opts));
}

private static function pad($text)
{
    $blockSize = 8;
    $length = strlen($text);
    $pad = $blockSize - ($length % $blockSize);
    return str_pad($text, $length + $pad, chr($pad));
}

private static function unpad($text)
{
    $length = ord($text[strlen($text) - 1]);
    return substr($text, 0, -$length);
}
要在PHP中实现与Java的兼容性,需要使用ECB模式而不是CBC模式,并应用PKCS#5填充(与PKCS#7填充相同)。显示了该填充的实现。您只需使用正确的块大小,即DES为8


切勿使用。它是确定性的,因此在语义上不安全。您至少应该使用随机模式,如或。最好是对密文进行身份验证,这样就不可能进行类似的攻击。这可以通过诸如GCM或EAX之类的经过身份验证的模式来实现,也可以通过一个方案来实现


静脉注射必须是不可预测的(阅读:随机)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定以前何时发送相同的消息前缀。IV不是秘密,所以你可以把它和密文一起发送。通常,它只是在密文前面加上前缀,并在解密之前切掉。

DES不再被认为是安全的,不应该使用,如果您对安全感兴趣,请使用AES。最好不要使用mcrypt,它是废弃软件,多年来没有更新过,不支持标准PKCS#7(née PKCS#5)填充,只支持非标准的空填充,甚至不能用于二进制数据。mcrypt在2003年就有很多杰出的作品。相反,考虑使用,它是保持和纠正。DES不再被认为是安全的,不应该被使用,而不是使用AES——如果你对安全感兴趣。最好不要使用mcrypt,它是废弃软件,多年来没有更新过,不支持标准PKCS#7(née PKCS#5)填充,只支持非标准的空填充,甚至不能用于二进制数据。mcrypt在2003年就有很多杰出的作品。取而代之的是考虑使用,它是维护和正确的。
public static function encryptDes($data, $key)
{
     $paddedData = static::pad($data);
     $opts = OPENSSL_ZERO_PADDING | OPENSSL_RAW_DATA;
     return strtoupper(bin2hex(openssl_encrypt($paddedData, 'DES-ECB', $key, $opts)));
}

public static function decryptDes($data, $key)
{
    $data = hex2bin($data);
    $opts = OPENSSL_ZERO_PADDING | OPENSSL_RAW_DATA;
    return static::unpad(openssl_decrypt($data, 'DES-ECB', $key, $opts));
}

private static function pad($text)
{
    $blockSize = 8;
    $length = strlen($text);
    $pad = $blockSize - ($length % $blockSize);
    return str_pad($text, $length + $pad, chr($pad));
}

private static function unpad($text)
{
    $length = ord($text[strlen($text) - 1]);
    return substr($text, 0, -$length);
}