我在java中尝试“AES / CCM / PKCS5Padding”加密,但我得到一些例外可以帮助我如何使用CCM代码进行加密

时间:2017-08-01 16:42:14

标签: java encryption aes jce

public class AESCCMEncryption {
     public static int AES_KEY_SIZE = 128 ;
     public static int TAG_BIT_LENGTH = 128 ;
     public static String ALGO_TRANSFORMATION_STRING = "AES/CCM/PKCS5Padding" ;
     public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {


    SecretKey aesKey = null ;
    String message="messageToEncrypt";
    try {
        KeyGenerator keygen = KeyGenerator.getInstance("AES") ;  
        keygen.init(AES_KEY_SIZE) ; 
        aesKey = keygen.generateKey() ;
    } catch(NoSuchAlgorithmException noSuchAlgoExc) { System.out.println("Key being request is for AES algorithm, but this cryptographic algorithm is not available in the environment "  + noSuchAlgoExc) ; System.exit(1) ; }
    byte[] encryptedText = aesEncrypt(message, aesKey) ;
    byte[] decryptedText = aesDecrypt(encryptedText, aesKey) ; 

    System.out.println("Decrypted text " + new String(decryptedText)) ;

}
     public static byte[] aesEncrypt(String message, SecretKey aesKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
         Cipher c = null ;
                c = Cipher.getInstance(ALGO_TRANSFORMATION_STRING); 
                c.init(Cipher.ENCRYPT_MODE, aesKey) ;
                byte[] cipherTextInByteArr = null ;
               cipherTextInByteArr = c.doFinal(message.getBytes()) ;
              return cipherTextInByteArr ;
 } 
     public static byte[] aesDecrypt(byte[] encryptedMessage, SecretKey aesKey) throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException {
         Cipher c = null ;
              c = Cipher.getInstance(ALGO_TRANSFORMATION_STRING); // Transformation specifies algortihm, mode of operation and padding
              c.init(Cipher.DECRYPT_MODE, aesKey) ;
              byte[] plainTextInByteArr = null ;
              plainTextInByteArr = c.doFinal(encryptedMessage) ;
          return plainTextInByteArr ;
       }
}

我正在使用java 1.8版本获得不受支持的异常 如果我错了可以帮助我如何实现“AES / CCM / PKCS5Padding” 有必要为加密添加IV矢量规范

2 个答案:

答案 0 :(得分:2)

我知道这已经很晚了,对不起 - 我一直在研究如何自己做AES / CCM。

无论如何,bouncycastle API支持CCM。如果您还没有它,那么添加它非常简单,因为它只是一个.jar文件。您可以访问java下载页面here以获取.jar。

但是,您可以通过运行以下代码来查看当前的安全提供程序:

        Provider[] providers = Security.getProviders();
        for (int i = 0; i < providers.length; i++){
            Log.e("Provider", "Name: " + providers[i].getName() + " Version: " + providers[i].getVersion());
        }

我得到以下输出:

enter image description here

经过快速搜索后,它已经非常明显了,但是&#34; BC版本:1.52&#34;是Bouncy Castle。

我还找到了一个示例.pdf表示&#34; PKCS7Padding通常也被称为PKCS5Padding。&#34;我没有使用填充,所以我必须让你对此进行研究。你可以找到那篇文章here。引用在第17页,但您可以使用CTRL-F更快地找到它,然后粘贴到PKCS5Padding中。这些例子只有CBC和EBC。

作为旁注,您可以在this页面上看到支持PKCS。

我希望这有帮助!

答案 1 :(得分:0)

由于全局安全问题,默认JRE不包括对更高级加密的支持。您必须下载“无限安全”补丁 - 当前链接为http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

下载补丁并按照其中包含的README.TXT文件中的说明进行操作。

只允许位于“受制裁”国家/地区的客户下载该修补程序。

当然没有机会使用VPN来躲避这种限制,或者通过文件共享软件提供补丁。