【发布时间】:2015-12-07 03:48:29
【问题描述】:
我不是密码学专业人士,特别是由于 OpenSSL 缺少很多文档,我不确定如何解决这个问题。
我有一个期望接收加密消息的外部系统。提供的唯一示例以这种方式使用 OpenSSL:
$ openssl enc -aes-256-cbc -a -in t.txt -k testpass
U2FsdGVkX1/RUdaSJKRXhHv3zUyTsQwu5/ar2ECKDlrNyH5GL4xRR4fgxkiWqkS1
cQstcoSIgWfRPSOFj/5OtdNLeNXiVR6MxSKJ+NvS9LyUD8+Rg6XIcYUvxR4gHi3w
DWT44LAMCpRAh1Q0t4Z2g7rwb0D05T6ygLaWvB5zD/xGZD3brTqSlWmiJb9Imgda
M6soZO7BhbYdqWqEUl5r6+EbkD21f6L3NX3hJFo+BJ+VFctiAlBO8NwT5l4ogo/s
GErm8gqRr57XoX/kvKAimg==
t.txt 文件在其中一行包含此字符串:
AMOUNT=10&TID=#19:23&CURRENCY=EUR&LANGUAGE=DE&SUCCESS_URL=http://some.url/sucess&ERROR_URL=http://some.url/error&CONFIRMATION_URL=http://some.url/confirm&NAME=customer full name`
我找到了this 其他问题,我已经能够使用以下代码进行加密:
String password = "passPhrase";
String salt = "15charRandomSalt";
int iterations = 100;
/* Derive the key, given password and salt. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(Charset.forName("UTF8")), iterations, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
/* Encrypt the message. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] cipherText = cipher.doFinal(toBeEncrypted.getBytes("UTF-8"));
encryptedData = Base64.getEncoder().encodeToString(cipherText);
encryptedData += Base64.getEncoder().encodeToString(iv);
我无法理解的是我应该如何生成与 OpenSSL 类似的输出(加密数据)。我有盐、iv 和 cipherText,OpenSSL 输出 Base64 编码结果是这些连接的结果吗?还是只有其中一个?
在加密之前我与其他系统共享的唯一内容是密码短语。如果他们不知道盐和迭代次数,他们如何解密结果?
谁能回答那些未知参数,并告诉我上面的代码是否相当于OpenSSL过程?
【问题讨论】:
-
OpenSSL commandline
enc默认执行 PBE,但您可以使用-K(必须为大写)和-iv(如果适用)进行“原始”加密,请参见手册页。 OpenSSL 库分别提供密码和 PBKDF,程序可以根据需要使用。 -
此外,如果您(可以)使用BouncyCastle.org 第三方提供商,它已经为每个 PBEWITHMD5AND{128,192,256}BITAES-CBC-OPENSSL 编写了 JCA 密钥工厂和密码。你仍然需要做文件头和base64。
-
我不需要做的是改变 OpenSSL 进程。我实际上必须在 java 中重建相同的过程。我会看看 BouncyCastle.org API。
-
@momnag 如果您可以添加文件 t.txt,我们可以确定加密是如何工作的。
-
@JonathanRosenne 使用示例加密的数据和结果更新了问题。
标签: java encryption openssl cryptography