1 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
操作員界面至少存在兩個(gè)問(wèn)題。首先,您使用錯(cuò)誤的密碼模式 RSA 加密密鑰:您在應(yīng)該使用加密時(shí)使用了 DECRYPT 模式。其次,您使用的是沒(méi)有任何填充的 RSA。您需要使用真正的填充模式,建議使用其中一種 OEAP 填充模式。
調(diào)整用于保存結(jié)果的緩沖區(qū)大小時(shí),加密端發(fā)生錯(cuò)誤:
ByteBuffer buffer = ByteBuffer.allocate(IV_BIT_LEN + encryptedSecretKey.length + cryptedBytes.length);
分配太多空間。IV_BIT_LEN
可能應(yīng)該更改為IV_SIZE
以獲得正確大小的ByteBuffer
.
最后一個(gè)錯(cuò)誤是GCMParameterSpec
在解密端設(shè)置 時(shí)沒(méi)有考慮到 GCM 認(rèn)證標(biāo)簽長(zhǎng)度。您在此行中初始化了標(biāo)簽長(zhǎng)度
GCMParameterSpec parameterSpec = new GCMParameterSpec(IV_BIT_LEN, iv);
但這是不正確的,標(biāo)簽長(zhǎng)度與 IV 無(wú)關(guān)。由于您沒(méi)有在加密端明確設(shè)置 GCMParameterSpec,因此您獲得了默認(rèn)標(biāo)簽長(zhǎng)度,恰好是 128。
您可以通過(guò)調(diào)用cipher.getParameters().getParameterSpec(GCMParameterSpec.class)
獲取參數(shù)規(guī)范來(lái)檢索加密端的標(biāo)簽長(zhǎng)度 。從中您可以檢索標(biāo)簽長(zhǎng)度和 iv。您可能應(yīng)該將標(biāo)簽長(zhǎng)度(16 字節(jié) = 128 位)視為硬編碼常量,而不是傳輸它。接收器應(yīng)該類(lèi)似地假設(shè)標(biāo)簽長(zhǎng)度是 128 位。
添加回答
舉報(bào)