老派java+eclipse+sprint boot遇到3DES加密問題

API,傳資料只用簡單的3DES加解密,但是java 預設只有3DES的PKCS5Padding,要達到PKCS7Padding(windows c# 只支援PKCS7Padding),就只能請Bouncy Castle幫忙,我使用bcprov-jdk15to18-1.78.1.jar、jdk17。

程式改寫大概如下:

// java 只有padding5,用bouncycastle,改寫成可使用padding7
static {
if(Security.getProvider("BC")!=null) Security.removeProvider("BC");
Security.addProvider(new BouncyCastleProvider());
}


// 使用CBC、PKCS7Padding
原本寫法
Cipher decryptCipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
改成
Cipher decryptCipher = Cipher.getInstance("DESede/CBC/PKCS7Padding","BC");

在Eclipse開發時很正常,正式執行時,出現以下錯誤:

jce cannot authenticate the provider bc

我查了一下原來jdk 17是17.0.9版,這問題於jdk 17.0.10(2024年1月)解決,就這麼剛好只差一版;最後,我升級至目前最新 jdk17.0.12版就解決了。參考來源


另外 windows uwp c#寫法也幾乎一至,因java是API,windows app為client,所以也就順手了解一下

public static String Encrypt3DesCbcPKCS7Padding(String sIV,String sSecretKey, String sData)
{
TripleDES tdes = TripleDES.Create();
IvParameterSpec ivSpec = new IvParameterSpec(System.Text.Encoding.UTF8.GetBytes(sIV));
SecretKeySpec secretKeySpec = new SecretKeySpec(System.Text.Encoding.UTF8.GetBytes(sSecretKey), "DESede");
Cipher encryptCipher = Cipher.GetInstance("DESede/CBC/PKCS7Padding", "BC");
encryptCipher.Init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec);
return Base64.ToBase64String(encryptCipher.DoFinal(System.Text.Encoding.UTF8.GetBytes(sData)));

}

發表迴響