· 9 years ago · Aug 26, 2016, 11:38 PM
1override fun decrypt(inputStream: InputStream, outputStream: OutputStream, key: SecretKey, algorithm: String, ivParameterSpec: IvParameterSpec?, secureRandom: SecureRandom?) {
2 val decryptionCipher = Cipher.getInstance(algorithm, "BC")
3 decryptionCipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec, secureRandom)
4 val cipherInputStream = CipherInputStream(inputStream, decryptionCipher)
5 copy(cipherInputStream, outputStream)
6}
7
8override fun encrypt(inputStream: InputStream, outputStream: OutputStream, key: SecretKey, algorithm: String, ivParameterSpec: IvParameterSpec?, secureRandom: SecureRandom?) {
9 val encryptionCipher = Cipher.getInstance(algorithm, "BC")
10 encryptionCipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec, secureRandom)
11 val cipherOutputStream = CipherOutputStream(outputStream, encryptionCipher)
12 copy(inputStream,cipherOutputStream)
13}
14
15fun copy(inputStream: InputStream, outputStream: OutputStream) {
16 try {
17 val byteArray = ByteArray(1024)
18 var inputLength = inputStream.read(byteArray)
19 while (inputLength != -1) {
20 outputStream.write(byteArray, 0, inputLength)
21 inputLength = inputStream.read(byteArray)
22 }
23 inputStream.close()
24 outputStream.close()
25 } catch (ex: Exception) {
26 LOG.error(ex.message)
27 throw EncryptionServiceException(ex.message, ex)
28 }
29}
30
31val secureRandom: SecureRandom = SecureRandom.getInstanceStrong()
32val testKey = BouncyCastleServiceFactory().encryptionServiceKeyService.generateSymmetricKey("AES",128, secureRandom)
33
34val byteArray = ByteArray(16)
35secureRandom.nextBytes(byteArray)
36var ivParameterSpec = IvParameterSpec(byteArray)
37val encryptedFile = File.createTempFile("encryptedfile",".dat")
38encrypt(FileInputStream(testFilePath), encryptedFile.outputStream(), testKey!!, "AES/CBC/PKCS5Padding", ivParameterSpec, secureRandom)
39val decryptedFile = File.createTempFile("decryptedfile",".dat")
40secureRandom.nextBytes(byteArray)
41ivParameterSpec = IvParameterSpec(byteArray)
42decrypt(encryptedFile.inputStream(), decryptedFile.outputStream(), testKey!!, "AES/CBC/PKCS5Padding", ivParameterSpec, secureRandom)
43
44Caused by: java.io.IOException: javax.crypto.BadPaddingException: pad block corrupted
45at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:121)
46at javax.crypto.CipherInputStream.read(CipherInputStream.java:239)
47at javax.crypto.CipherInputStream.read(CipherInputStream.java:215)
48at com.irotsoma.cloudbackenc.encryptionservice.bouncycastle.BouncyCastleFileService.copy(BouncyCastleFileService.kt:43)
49... 29 more
50Caused by: javax.crypto.BadPaddingException: pad block corrupted
51at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher.doFinal(Unknown Source)
52at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
53at javax.crypto.Cipher.doFinal(Cipher.java:2048)
54at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:118)
55... 32 more