为php和java实现的加密方法?

use*_*114 5 php java encryption

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

我想加密java端的字符串,传递给php脚本,然后让php脚本解密它们.

由于我正在使用的提供商的限制,我无法使用https.

谢谢

laz*_*laz 14

希望这可以帮助你入门.缺少错误处理,密钥是硬编码的.需要针对生产质量代码解决这两个问题.从Java端,您可以使用Java加密体系结构(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);
}
Run Code Online (Sandbox Code Playgroud)

从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);
}
?>
Run Code Online (Sandbox Code Playgroud)

该函数pkcs5_unpad是从这里复制的,因为似乎PHP Mcrypt不包含对PKCS5填充的支持.Java代码使用用于加密数据的初始化向量为数据添加前缀.随后PHP代码将其分为两部分,即初始化向量和加密数据.

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