【问题标题】:Encryption method that's implemented for both php and java?为php和java实现的加密方法?
【发布时间】:2011-03-15 02:37:15
【问题描述】:

我必须将一些字符串从 java servlet 传递到 php 脚本。有哪些加密字符串的选项?我需要一个同时为 java 和 php 实现的方法(比如 ..a caesar cipher ...)。是否有任何标准加密方法我应该能够为 java 和 php 获得一个库?

我想在java端加密字符串,传给php脚本,然后让php脚本解密。

由于我使用的提供商的限制,我无法使用 https。

谢谢

【问题讨论】:

    标签: java php encryption


    【解决方案1】:

    希望这可以帮助您入门。缺少错误处理并且密钥是硬编码的。生产质量代码需要解决这两个问题。在 Java 端,您可以使用 Java Cryptography Architecture (JCA):

    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import javax.xml.bind.DatatypeConverter;
    
    public final void testTesting() throws Exception {
        final String plainText = "plain text";
        final String result = encrypt(plainText);
        System.out.println(result);
    }
    
    public String encrypt(final String plainText) throws Exception {
        final byte[] data = plainText.getBytes("UTF-8");
        final byte[] encoded = encrypt(data);
        final String result = new String(encoded);
        return result;
    }
    
    public byte[] encrypt(final byte[] data) throws Exception {
        // this is just an example key, real code should use a properly generated shared secret
        final byte[] secret = new byte[] {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42};
        final SecretKeySpec key = new SecretKeySpec(secret, "AES");
    
        final Cipher encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        encryptCipher.init(Cipher.ENCRYPT_MODE, key);
        final byte[] iv = encryptCipher.getIV();
        final byte[] encrypted = encryptCipher.doFinal(data);
    
        final int outputLength = encrypted.length;
        final int ivLength = iv.length;
    
        final byte[] results = new byte[outputLength + ivLength];
        System.arraycopy(iv, 0, results, 0, ivLength);
        System.arraycopy(encrypted, 0, results, ivLength, outputLength);
    
        return DatatypeConverter.printBase64Binary(encoded);
    }
    

    在 PHP 方面,您将需要 Mcrypt

    <?php
    $key = base64_decode('KioqKioqKioqKioqKioqKg==');
    $input = base64_decode($_GET['input']);
    $plain_text = substr($input, 16);
    $initialization_vector = substr($input, 0, 16);
    echo pkcs5_unpad(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $plain_text, MCRYPT_MODE_CBC, $initialization_vector));
    
    function pkcs5_unpad($text) {
        $pad = ord($text{strlen($text)-1});
        if ($pad > strlen($text)) {
            return false;
        }
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
            return false;
        }
        return substr($text, 0, -1 * $pad);
    }
    ?>
    

    函数pkcs5_unpad 是从here 复制而来的,因为PHP Mcrypt 似乎不包含对PKCS5 填充的支持。 Java 代码在数据前面加上用于加密的初始化向量。随后 PHP 代码将其拆分为两部分,初始化向量和加密数据。

    此代码在 CBC 模式下使用 128 位 AES (Rijndael),对于大多数用途来说应该足够安全。除了简单的加密,我建议使用HMAC 描述的here 以确保数据不被篡改。要在 Java 中执行 HMAC,请使用 Mac 类。对于 PHP,请参阅Mhash

    【讨论】:

    • 哇,这正是我需要的。我会试一试,感谢您设置所有这些,会报告。
    【解决方案2】:

    Jasypt (http://www.jasypt.org/) 将使用您想要的任何算法。应该能够在几分钟内实现任何常见的算法。

    【讨论】:

      【解决方案3】:

      查看 PHP 的 mcrypt 扩展名。其中之一几乎肯定存在于 Java 中。

      【讨论】:

        【解决方案4】:

        大多数标准加密算法在 PHP 和 Java 中都可用。

        看看:

        如你所见,它们至少都支持DES、TripleDES、RC2。

        【讨论】:

          猜你喜欢
          • 2014-08-26
          • 1970-01-01
          • 2015-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-20
          • 2012-09-13
          相关资源
          最近更新 更多