import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
class AES256JavaPhp{
public static void main(String[] args) throws Exception {
Base64 base64 = new Base64();
Cipher ciper = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec key = new
SecretKeySpec("PasswordPassword".getBytes("UTF-8"),"AES");
IvParameterSpec iv = new IvParameterSpec
("dynamic@dynamic@".getBytes("UTF-8"),0,ciper.getBlockSize());
//Encrypt
ciper.init(Cipher.ENCRYPT_MODE, key,iv);
byte[] encryptedCiperBytes = base64.encode
((ciper.doFinal("Hello".getBytes())));
System.out.println("Ciper : "+new String(encryptedCiperBytes));
//Decrypt
ciper.init(Cipher.DECRYPT_MODE, key,iv);
byte[] text = ciper.doFinal(base64.decode(encryptedCiperBytes));
System.out.println("Decrypt text : "+new String(text));
}
}
Java输出:
Ciper : KpgzpzCRU7mTKZePpPlEvA==
Decrypt text : Hello
<?php>
$cipherText = encrypt("Hello", 'aes-256-cbc');
exit();
function encrypt($data, $algo)
{
$key = 'PasswordPassword';
//$iv = random_bytes(openssl_cipher_iv_length($algo));
$iv = 'dynamic@dynamic@';
$cipherText = openssl_encrypt(
$data,
$algo,
$key,
OPENSSL_RAW_DATA,
$iv
);
$cipherText = base64_encode($cipherText);
printData("Ciper Text : $cipherText");
$cipherText = base64_decode($cipherText);
$plaintext = openssl_decrypt(
$cipherText,
$algo,
$key,
OPENSSL_RAW_DATA,
$iv
);
printData("Plain Text after decryption : $plaintext");
}
function printData($obj)
{
print_r($obj);
}
?>
PHP输出:
Ciper Text : ef/ENVlBn9QBFlkvoN7P2Q==
Plain Text after decryption : Hello
生成的密码是不同的,即使它们使用相同的密钥和 IV。这怎么可能?
您的密钥只有128位(16字节)长,但您请求的是PHP中的AES-256。这将导致256位(32字节)的填充AES密钥。您必须请求AES-128才能正常工作。这就是OpenSSL扩展在PHP中的工作方式。
理想情况下,密钥应该看起来像随机噪声,以防止暴力攻击。您当前的密钥不是那个。这是很容易预测的。你真的应该生成一些随机的密钥,并以类似Base64的编码形式添加到你的代码中。然后你可以在使用前解码。
显然,对于安全会话,您必须使用相同的AES密钥和IV。并且它们必须在客户端之间进行正确和安全的通信。客户用什么语言编写根本不重要。您的问题是不理解密钥协商和会话建立的协议。
初始化向量不是受保护的值;也就是说,在客户端之间进行通信时,您没有对其进行加密。它必须用加密的AES密钥(从某个密钥协商协议中获得)以明文形式打包。
CMS使用< code > KeyTransRecipientInfo 来传递此信息。TLS还定义了握手之后的IV建立。我强烈建议遵循CMS实现,而不是一些人为的和几乎肯定会包含安全漏洞的东西。
现在很明显,您对为什么生成的密文不是确定性的感到困惑。这是因为Java实现默认为128位加密,并提供了128位密钥,但PHP代码请求256位强度加密,并且只提供了相同的128位密钥。因此,PHP必须填充密钥。
根据您的以下评论,下面是一个使用Java生成256位密钥的示例:
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(256); // The AES key size in number of bits
SecretKey secKey = generator.generateKey();
问题内容: 我一直在尝试使用AES-128 CBC解密字符串,该字符串最初是使用JAVA AES加密加密的。在Java中,使用PKCS7填充。而且我尝试使用类似的PHP代码进行加密和解密。但是我得到了不同的结果。 我的Java代码 以及我正在使用的等效PHP代码。 在Java中 纯文本= 123456 密码文本= tpyxISJ83dqEs3uw8bN / + w == 在PHP中 纯文本=
我一直在尝试使用AES-128 CBC解密一个字符串,它最初是使用JAVA AES加密加密的。在java中,使用了PKCS7填充。我试着用类似的PHP代码进行加密和解密。但我得到了不同的结果。 我的Java代码 以及我正在使用的等效PHP代码。 在Java 纯文本=123456 密码文本=tpyxISJ83dqEs3uw8bN/w== 在PHP中 纯文本=123456 密码文本=ierqftckt
我正在尝试通过Windows命令提示符加密(openssl aes-256-cbc)字符串并在PHP中解密结果。 我通过以下方式完成了加密: 对于解密,我的php代码是: 但是解密的字符串是空的。请帮忙。 (注意:我还需要执行相反的过程,即在php中加密和在WIN命令提示符下解密。所以请添加任何可能有帮助的建议。)
为什么PHP解密方法不能解密用Java加密的数据? 当我仅使用Java或仅在PHP中加密和解密数据时,一切工作都很好。 加密的数据被发送到服务器,在那里我尝试用PHP openssl_decrypt对其进行解密 不幸的是,openssl_decrypt返回一个空字符串。
问题内容: 我正在尝试在java中加密数据并在ruby中解密数据。 我的代码是…用Java加密 结果是 我希望在Ruby中解密(加密的字符串) Ruby代码是…(错误) 我希望得到 但它返回错误 我认为问题是cipher.padding和key / iv的类型。但是我不知道如何完成红宝石代码。 请让我知道如何完成此代码。 谢谢。 问题答案: Ruby代码有两个问题。 首先,应该使用AES 128时
问题内容: 我找到了在PHP中对字符串进行编码/解码的示例。起初它看起来非常好,但是不会起作用:-( 有人知道问题出在哪里吗? 结果是: 加密: 解密: 问题答案: 并且 在您的代码中未定义。查看有效的解决方案( 但不安全! ): 停! 这个例子是 不安全的! 不要使用它! **但是此代码中还有其他问题,使其变得不安全,尤其是使用ECB(这不是_加密_模式,只能在其上定义加密模式的构造块)。