GNU/Linux >> Belajar Linux >  >> Linux

Pengecualian ukuran blok ilegal – CKR_ENCRYPTED_DATA_LEN_RANGE [SoftHSM]

Saya telah berhasil menginstal dan mengkonfigurasi SoftHSM di CentOS. Untuk memeriksa apakah saya dapat berkomunikasi dengan SoftHSM secara terprogram, saya menulis program Java yang berinteraksi dengan token lunak dan melakukan enkripsi dan dekripsi string input. Namun, program berhasil mengenkripsi input tetapi gagal mendekripsinya. Metode dekripsi gagal dengan kesalahan – Pengecualian ukuran blok ilegal – CKR_ENCRYPTED_DATA_LEN_RANGE.

Ini sebagian kodenya.

String pkcs11ConfigData = "softhsm.cfg";
Provider pkcs11Provider = Security.getProvider("SunPKCS11");
pkcs11Provider = pkcs11Provider.configure(pkcs11ConfigData);

if (-1 == Security.addProvider(pkcs11Provider)) {
throw new RuntimeException("could not add security provider");
} else {
System.out.println("provider initialized !!!");
}

Security.addProvider(pkcs11Provider);

char[] pin = "abcdef123".toCharArray();
KeyStore keyStore;
try {
keyStore = KeyStore.getInstance("PKCS11", pkcs11Provider);
keyStore.load(null, pin);
SecretKeySpec secretKeySpec = new SecretKeySpec("0123456789ABCDEF".getBytes(), 0, 16, "AES");
Key key = new SecretKeySpec(secretKeySpec.getEncoded(), 0, 16, "AES");
keyStore.setKeyEntry("AA", key, "abcdef123".toCharArray(), null);
keyStore.store(null);
SecretKey key1 = (SecretKey) keyStore.getKey("AA", "abcdef123".toCharArray());
System.out.println("the algorithm: "+key1.getAlgorithm()+", the key: "+key1.toString()+", format: "+key1.serialVersionUID);

doCrypto(Cipher.ENCRYPT_MODE, key1, inputtext);

doCrypto(Cipher.DECRYPT_MODE, key1, encryptedtext);

} catch (KeyStoreException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}

private static void doCrypto(int cipherMode, Key key, String inputtext) throws Exception {
Key secretKey = key;
Cipher cipher;
try {
cipher = Cipher.getInstance(TRANSFORMATION);

cipher.init(cipherMode, secretKey);
byte[] inputBytes = inputtext.getBytes();
byte[] outputBytes;
outputBytes = cipher.doFinal(inputBytes);
if(cipherMode == Cipher.ENCRYPT_MODE) {
encryptedtext = outputBytes.toString();
System.out.println("==========================================");
System.out.println("encrypted text: "+outputBytes.toString());
System.out.println("==========================================");
}
if(cipherMode == Cipher.DECRYPT_MODE) {
System.out.println("*****************************************");
System.out.println("decrypted text: "+outputBytes.toString());
System.out.println("*****************************************");
}

} catch (NoSuchAlgorithmException e) {
System.out.println("No such algorithm exception");
e.printStackTrace();
} catch (NoSuchPaddingException e) {
System.out.println("No such padding exception");
e.printStackTrace();
} catch (InvalidKeyException e) {
System.out.println("Invalid key exception");
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
System.out.println("Illegal block size exception");
e.printStackTrace();
} catch (BadPaddingException e) {
System.out.println("Bad padding exception");
e.printStackTrace();
} finally {

}
}

Kesalahan keluaran:

Jadi bagaimana saya membuatnya bekerja? Inilah solusinya.

Cara memperbaiki Pengecualian ukuran blok ilegal – kesalahan CKR_ENCRYPTED_DATA_LEN_RANGE saat mengakses SoftHSM melalui kode Java?

Saat saya mengenkripsi string dengan algoritme AES, hasil yang diharapkan adalah array byte. Jadi, mengonversi byte tersebut secara langsung ke string seperti yang ditunjukkan di bawah ini yang menyebabkan masalah.

encryptedtext = outputBytes.toString();

Pada baris kode di atas, outputBytes bertipe bytes [] dan mengubahnya menjadi string secara langsung adalah masalahnya.

Untuk memperbaiki masalah ini, kita perlu menggunakan Base64 alih-alih langsung mengubahnya menjadi string.

byte[] cipherText = cipher.doFinal(inputtext.getBytes("utf-8"));
encryptedText = java.util.Base64.getEncoder().encodeToString(cipherText);

Baris di atas sedikit ditulis ulang untuk mengkodekan cipherText menggunakan Base64 dan simpan yang sama di encryptedText .

Demikian pula saat mendekripsi, kita perlu mengonversi Base64 string kembali ke array byte sebelum mendekripsi array byte.

byte[] deciphered = cipher.doFinal(java.util.Base64.getDecoder().decode(encryptedText));

Baris kode di atas menunjukkan bahwa kita perlu melakukan Base64 decode dan meneruskannya sebagai argumen ke metode dekripsi.

Itu dia! Berikut kode lengkapnya untuk referensi.

private static String performEncryption(Key secretKey, String inputtext) throws Exception {
String encryptedText = new String();
Cipher cipher;
try {
cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] cipherText = cipher.doFinal(inputtext.getBytes("utf-8"));
encryptedText = java.util.Base64.getEncoder().encodeToString(cipherText);
} catch (NoSuchAlgorithmException e) {
System.out.println("No such algorithm exception");
e.printStackTrace();
} catch (NoSuchPaddingException e) {
System.out.println("No such padding exception");
e.printStackTrace();
} catch (InvalidKeyException e) {
System.out.println("Invalid key exception");
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
System.out.println("Illegal block size exception");
e.printStackTrace();
} catch (BadPaddingException e) {
System.out.println("Bad padding exception");
e.printStackTrace();
} finally {

}
return encryptedText;
}

private static void performDecryption(Key key, String encryptedString) throws Exception {
Key secretKey = key;
Cipher cipher;
try {
cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] deciphered = cipher.doFinal(java.util.Base64.getDecoder().decode(encryptedString));
System.out.println("decrypted text: "+new String(deciphered));
} catch (NoSuchAlgorithmException e) {
System.out.println("No such algorithm exception");
e.printStackTrace();
} catch (NoSuchPaddingException e) {
System.out.println("No such padding exception");
e.printStackTrace();
} catch (InvalidKeyException e) {
System.out.println("Invalid key exception");
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
System.out.println("Illegal block size exception");
e.printStackTrace();
} catch (BadPaddingException e) {
System.out.println("Bad padding exception");
e.printStackTrace();
} finally {

}
}

Terima kasih atas jawaban dari Stackflow yang membantu saya memperbaiki masalah ini.

Terakhir, tangkapan layar dari output yang berhasil.


Linux
  1. Mengapa Server Memblokir IP Saya?

  2. Bagaimana Mengurutkan Du Output Berdasarkan Ukuran?

  3. Masalah Ukuran Blok Pencipta Disk Startup Usb?

  1. Tentukan ukuran perangkat blok

  2. Blokir akses jaringan dari suatu proses?

  3. Ukuran folder dengan du

  1. Pengecualian ukuran blok ilegal – CKR_ENCRYPTED_DATA_LEN_RANGE [SoftHSM]

  2. Mengapa tidak memblokir ICMP?

  3. Buat perangkat blok di RAM