【发布时间】:2020-01-17 18:58:39
【问题描述】:
我正在开发一个用纯 php 构建的项目,我正在对登录进行返工,但数据库中的用户是 Rijndael-256 中的密码,我尝试了很多东西,但似乎没有工作,我觉得我很接近这段代码,但它不起作用,我真的迷路了
private final String key = "...";
public String decrypt(String password, String cypherKey) {
try {
password = password.substring(0, password.lenght() - 1); // 1
byte[] passwordBytes = password.getBytes("UTF-8");
byte[] key = cypherKey.getBytes("UTF-8");
RijndaelEngine rijndaelEngine = new RijndaelEngine(256);
KeyParameter keyParam = new KeyParameter(key);
rijndaelEngine.init(false, keyParam); // 2
PaddedBufferedBlockCipher bufferedBlock = new PaddedBufferedBlockCipher(rijndaelEngine, new ZeroBytePadding());
byte[] decryptedBytes = new byte[bufferedBlock.getOutputSize(passwordBytes.length)];
int processed = bufferedBlock.processBytes(passwordBytes, 0, passwordBytes.length, decryptedBytes, 0);
return String.valueOf(bufferedBlock.doFinal(decryptedBytes, processed));
} catch (Exeption e) {
e.printStackTrace();
}
return ""; // I know this is awful but i was trying something and left this like that
}
*1) 我不知道这是否正确,但所有加密密码都以等号结尾,我使用加密工具进行了测试,我认为不需要它
2) False为解密模式
堆栈跟踪:org.bouncycastle.crypto.DataLengthException:最后一个块在解密中不完整
我正在为这个解密工作两个星期,我真的很绝望:(
PHP 代码:
function fnEncrypt($sValue)
{
include("constants.php");
return trim(
base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_256,
$SecretKey, $sValue,
MCRYPT_MODE_ECB,
mcrypt_create_iv(
mcrypt_get_iv_size(
MCRYPT_RIJNDAEL_256,
MCRYPT_MODE_ECB
),
MCRYPT_RAND)
)
)
);
}
function fnDecrypt($sValue)
{
include("constants.php");
return trim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_256,
$sSecretKey,
base64_decode($sValue),
MCRYPT_MODE_ECB,
mcrypt_create_iv(
mcrypt_get_iv_size(
MCRYPT_RIJNDAEL_256,
MCRYPT_MODE_ECB
),
MCRYPT_RAND
)
)
);
}
【问题讨论】:
-
如果可能,发送 PHP 代码进行加密。对于解密的实现,必须知道加密的细节。 Rijndael-256(256 位是块大小)相当不寻常(可能与 AES-256 混淆,其中 256 位是密钥大小)。等号表示 Base64 编码。
-
我上传了php代码,使用的方法在php中已被弃用,所以我认为这是一个大问题
-
仅供参考:ECB 不使用 IV,这是导致它对包括此在内的几乎所有用途都不安全的原因之一,但对于确实使用 IV 的模式,您必须在(每个)加密并存储或传输它并使用相同的,而不是创建一个新的,在解密
-
我知道这个方法不安全,系统是几年前有人做的,我们被雇来重建它,正如我在另一条评论中所说,老用户必须访问该页面没有任何问题,因此我必须输入密码并将其与存储在 DB 中的密码匹配
标签: java encryption rijndael