第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 MCRYPT_RIJNDAEL_256 密碼的 mcrypt_encrypt PHP

使用 MCRYPT_RIJNDAEL_256 密碼的 mcrypt_encrypt PHP

PHP
ABOUTYOU 2023-08-11 16:31:47
我有一個用于加密字符串(令牌)的 PHP 代碼。我需要生成此令牌并調(diào)用舊后端 API。后端 API 會解密并驗證它,然后才允許訪問 API。我們正在用 Java 構(gòu)建客戶端應(yīng)用程序。所以這段代碼需要用Java來實現(xiàn)。$stringToEncode="****String which needs to be encrypted. This string length is multiple of 32********************";$key="32ByteKey-asdcxzasdsadasdasdasda";    echo base64_encode(        mcrypt_encrypt(                    MCRYPT_RIJNDAEL_256,                    $key,                    $stringToEncode,                    MCRYPT_MODE_CBC,                    $key                )            );這里 IV 與 key 相同。我嘗試使用以下 Java 代碼使用“org.bouncycastle.crypto”private static void encrypt(String key, String data) throws InvalidCipherTextException {                    byte[] givenKey = key.getBytes(Charset.forName("ASCII"));                final int keysize = 256;        byte[] keyData = new byte[keysize / Byte.SIZE];        System.arraycopy(givenKey, 0, keyData, 0, Math.min(givenKey.length, keyData.length));        KeyParameter keyParameter = new KeyParameter(keyData);        BlockCipher rijndael = new RijndaelEngine(256);        ZeroBytePadding c = new ZeroBytePadding();        PaddedBufferedBlockCipher pbbc = new PaddedBufferedBlockCipher(rijndael, c);        CipherParameters ivAndKey = new ParametersWithIV(keyParameter, key.getBytes(Charset.forName("ASCII")));        pbbc.init(true, ivAndKey);        byte[] plaintext = data.getBytes(Charset.forName("UTF8"));        byte[] ciphertext = new byte[pbbc.getOutputSize(plaintext.length)];        int offset = 0;        offset += pbbc.processBytes(plaintext, 0, plaintext.length, ciphertext, offset);        offset += pbbc.doFinal(ciphertext, offset);        System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(ciphertext));    }但低于例外 -Exception in thread "main" java.lang.IllegalArgumentException: invalid parameter passed to Rijndael init - org.bouncycastle.crypto.params.ParametersWithIV
查看完整描述

1 回答

?
動漫人物

TA貢獻(xiàn)1815條經(jīng)驗 獲得超10個贊

PHP 代碼使用塊大小為 256 位的 Rijndael。SunJCE Provider 不支持此功能,僅支持 AES(它是 Rindael 的子集,塊大小為 128 位)。因此,第二個 Java 代碼片段也不起作用。因此必須使用像 BouncyCastle (BC) 這樣的第三方提供商。

Java/BC代碼中有兩個bug:

  • 與 PHP 代碼相反,沒有應(yīng)用 CBC。必須使用 來更改此設(shè)置CBCBlockCipher

  • BC 的零填充變體與 mcrypt 變體不同。BC 變體總是填充,即即使明文的長度已經(jīng)對應(yīng)于塊大小的整數(shù)倍(此處為 32 字節(jié)),mcrypt 變體也不會(即后者僅在明文長度不填充的情況下填充)對應(yīng)于塊大小的整數(shù)倍)。
    由于根據(jù)描述,明文已經(jīng)對應(yīng)于塊大小的整數(shù)倍,因此 mcrypt 變體不會填充。在 Java/BC 代碼中,如果根本不使用填充,就可以實現(xiàn)這一點。
    但要小心:如果明文的長度不對應(yīng)于塊大小的整數(shù)倍,那么當(dāng)然必須使用填充(考慮到與 PHP 代碼中使用的零填充變體的兼容性)。

這兩個問題都可以通過更換線路來解決

ZeroBytePadding?c?=?new?ZeroBytePadding();
PaddedBufferedBlockCipher?pbbc?=?new?PaddedBufferedBlockCipher(rijndael,?c);

經(jīng)過

BufferedBlockCipher?pbbc?=?new?BufferedBlockCipher(new?CBCBlockCipher(rijndael));

那么兩個代碼產(chǎn)生的密文是相同的。

一些附加說明:

  • 使用密鑰作為 IV 通常沒有用。由于出于安全原因,IV 對于給定密鑰只能使用一次,因此每次加密都必須使用新密鑰。
    通常在實踐中,每次加密都會生成一個新的、隨機(jī)的 IV。

  • 使用標(biāo)準(zhǔn)(即 AES)通常更安全,而不是使用塊大小為 256 位的 Rijndael,后者不是標(biāo)準(zhǔn)。

  • 零填充并不可靠(此外,正如您所經(jīng)歷的,有幾種變體可能會導(dǎo)致問題)。更可靠的是 PKCS7 填充。


查看完整回答
反對 回復(fù) 2023-08-11
  • 1 回答
  • 0 關(guān)注
  • 187 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號