当前位置: 首页 > 知识库问答 >
问题:

CMS加密数据解密与充气城堡抛出BadPaddingExc0019:垫块损坏

程亦
2023-03-14

我有CMS加密数据使用弹跳城堡,我想解密它的内容。然而,我遇到了获取javax的问题。加密。BadPaddingException:填充块已损坏。我相信,秘密钥匙有问题

val provider = new BouncyCastleProvider()

// output encoder
val gen = new CMSEncryptedDataGenerator()
val encoder = new JceCMSContentEncryptorBuilder(CMSAlgorithm.DES_EDE3_CBC).setProvider(BouncyCastleProvider.PROVIDER_NAME).build()

// secrete key
val spec = new DESedeKeySpec(encoder.getKey.getRepresentation.asInstanceOf[Array[Byte]])
val keyFactory = SecretKeyFactory.getInstance("DESEDE", provider)
val secretKey = keyFactory.generateSecret(spec)

// Encryption
val cmsEncryptedData: CMSEncryptedData = gen.generate(new CMSProcessableByteArray("Hello World!".getBytes()), encoder)

// Decryption
val decryptedContententBinary: Array[Byte] = {
  cmsEncryptedData.getContent(new InputDecryptorProvider {
    override def get(algorithm: AlgorithmIdentifier): InputDecryptor = new InputDecryptor {

      override def getAlgorithmIdentifier: AlgorithmIdentifier = algorithm

      override def getInputStream(encIn: InputStream): InputStream = {
        val parameters = new JceAlgorithmIdentifierConverter().setProvider(provider).getAlgorithmParameters(algorithm)
        val cipher = Cipher.getInstance(parameters.getAlgorithm, provider)
        cipher.init(Cipher.DECRYPT_MODE, secretKey, parameters) // throws javax.crypto.BadPaddingException: pad block corrupted
        new CipherInputStream(encIn, cipher)
      }
    }
  })
}

共有1个答案

漆雕正奇
2023-03-14

我刚刚解决了我的问题。以下是工作代码:

// output encoder
val gen = new CMSEncryptedDataGenerator()
val random = new SecureRandom()
val encoder = new JceCMSContentEncryptorBuilder(CMSAlgorithm.DES_EDE3_CBC).setProvider(BouncyCastleProvider.PROVIDER_NAME).setSecureRandom(random).build()


// secrete key
val key = new SecretKeySpec(encoder.getKey.getRepresentation.asInstanceOf[Array[Byte]], "DESede")

// Encryption
val cmsEncryptedData: CMSEncryptedData = gen.generate(new CMSProcessableByteArray("Hello World!".getBytes()), encoder)


// Decryption
val decryptedContententBinary: Array[Byte] = {
  cmsEncryptedData.getContent(new InputDecryptorProvider {
    override def get(algorithm: AlgorithmIdentifier): InputDecryptor = new InputDecryptor {

      override def getAlgorithmIdentifier: AlgorithmIdentifier = algorithm

      override def getInputStream(encIn: InputStream): InputStream = {

        val parameters = new JceAlgorithmIdentifierConverter().setProvider(provider).getAlgorithmParameters(encoder.getAlgorithmIdentifier)
        val cipher = Cipher.getInstance(algorithm.getAlgorithm.getId, provider)
        cipher.init(Cipher.DECRYPT_MODE, key, parameters)
        new CipherInputStream(encIn, cipher)
      }
    }
  })
}
 类似资料:
  • 我尝试解密从Web服务接收的加密数据。 使用AES 128进行加密。 我使用以下代码对数据进行解密: 在 密码doFinal() 我得到了以下例外: javax.crypto.badpaddingexception垫块损坏 我浏览了我的帖子,但没有找到解决办法。我被困在这里了。

  • 我做了很多研究,但我找不到我的问题的答案。我在做AES加密(Rijndael块大小128位)。NET和解密在Android(AES)与相同的密码,盐 C#加密代码片段: Android解密代码段: 密码doFinal调用引发以下异常。 “05-02 18:17:38.239:W/System.err(25547):javax.crypto.BadPaddingException:填充块损坏” 我确

  • 问题内容: 任何人都可以向我展示(或提供指向)如何使用充气城堡在Java中加密文件的示例吗?我查看了bouncycastle.org,但找不到其API的任何文档。即使只是知道要使用哪些类,也对我入门很有帮助! 问题答案: 您要执行哪种类型的加密?基于密码(PBE),对称,不对称?这就是您配置Cipher的全部方法。 您不必使用任何BouncyCastle特定的API,只需使用它提供的算法即可。这是

  • 有人能解释一下为什么这段代码在解密密钥时会在最后一行抛出吗? 以下是来自https://stackoverflow.com/a/27886397/66722对于使用OAEP的RSA也是如此? “RSA/ECB/PKCS1Padding”实际上没有实现ECB模式加密。它应该被称为“RSA/None/PKCS1Padding”,因为它只能用于加密单个明文块(或者实际上是一个密钥)。这只是Sun/Ora

  • 加密是使用Stanford Javascript加密库(SJCL)完成的。下面是一个完整的加密示例,分为两部分。第一个是关于PBKDF2的基于密码的密钥派生。在第二部分中,使用派生密钥和初始化向量(IV)进行实际加密。注意,salt和IV是硬编码的,以便更容易提供C#解密解决方案。 null 变量的值: SJCL位阵列: 十六进制编码: Base64编码: 变量的值: null AES/CCM解密

  • 我的项目正在对来自某些第三方软件的某些数据集进行签名验证。使用的签名算法是 。当我使用SDK附带的标准SUN加密提供程序时,一切都很顺利。最近我切换到了Bouncy Castle 1.50,之后,一些以前(即SUN提供者)进行验证的数据集开始失败,而其余的仍然被验证正常。 我探索了两个提供程序的源代码,结果发现SDK的默认提供程序对格式错误的签名有某种保护(同时能够恢复),而Bouncy Cast