2017-08-01 54 views
2
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矢量規範加密我試圖「AES/CCM/PKCS5Padding」在Java加密,但我得到了一些例外任何一個可以幫助我如何使用CCM代碼

+3

您需要找到支持CCM模式的安全提供程序。默認的Sun JCE不會那樣做。 –

回答

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

快速搜索後,它的已經相當明顯,但「BC版本:1.52」是充氣城堡。

我還發現了一個示例.pdf,其中指出「PKCS7Padding通常也被稱爲PKCS5Padding」。我沒有使用填充,所以我不得不讓你做這方面的研究。你可以找到那篇文章here。該報價在第17頁,但您可以使用CTRL-F更快地找到它,然後粘貼到PKCS5Padding中。雖然只有CBC和EBC的例子。

作爲便箋,您可以在this頁面上看到支持PKCS。

我希望這有助於!

+0

是的,JCE使用名稱PKCS5Padding來表示真正的PKCS7(大多數情況下),但是CCM根本不使用任何填充。使用BC確實是一個答案,可能是最好的答案,儘管可以用CTR + CBCMAC構建CCM並做一些工作。 –

1

由於全球安全問題,默認的JRE不包括對更高級加密的支持。您必須下載「無限安全」補丁 - 當前鏈接是http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

下載該補丁並按照其中包含的README.TXT文件中的說明進行操作。

只有位於「制裁」國家的客戶纔可以下載該補丁。

當然沒有機會使用VPN來避開該限制,或者該補丁可通過文件共享軟件獲得。

+0

甲骨文(以前稱爲Sun Java的無限制政策)隻影響超過128位的密鑰大小/優勢,與此問題無關,儘管它對於其他問題是一個很好的答案。 –

相關問題