2011-01-18 2 views
2

에 대한 메시지 인증 코드를 얻을 수 있습니다 :에서는 다음과 같이 내가 텍스트를 암호화 한 BouncyCastle AES-CCM 암호화 된 메시지

Cipher in = Cipher.getInstance("AES/CCM/NoPadding", "BC"); 
in.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(_nonce)); 
encoded = in.doFinal(payload); 

큰 작동합니다. 나는 MAC을 얻고 싶은, 그래서 나는 이것을 시도 :

byte[] K = Hex.decode(bek.getBytes()); 
Key key = new SecretKeySpec(K, "AES"); 
Mac mac = Mac.getInstance("AES/CCM/NoPadding", "BC"); 

을하지만 "이러한 알고리즘 : 공급자 BC를위한 AES/CCM/NoPadding"을 얻을 수 없습니다.

따라서 AES/CCM으로 암호화 된 메시지에서 MAC을 추출하는 알고리즘은 무엇입니까? 감사!

답변

0

CCM 모드는 AES 용 CBC 블록 암호화 MAC의 사용을 의미하므로 사용해야하는 알고리즘이지만 CCM 모드는이 알고리즘을 사용하는 코드를 작성하지 않았습니다. 나는 BouncyCastle이 CBCBlockCipherMac 클래스로 이것을 구현하지만, 올바른 알고리즘 이름을 100 % 확신하지는 않지만 sourcecode를 보면 "AESMac"(기본적으로 CBC 모드와 제로 패딩 사용) 인 것으로 보입니다.

0

JCE를 사용하여 MAC을 추출 할 수 없으며 단순히 지원되지 않습니다. Bouncycastle crypto API를 직접 사용해야합니다. CCMBlockCipher 클래스는 Mac 바이트를 검색하는 방법이 getMac입니다.

0

예 사이퍼 텍스트에 인증 태그 (mac)가 있습니다. 처리에 n 비트의 Mac을 사용했다면 사이퍼 텍스트의 마지막 n 비트가 mac입니다.

당신은 또한 코드

CCMBlockCipher cipher = new CCMBlockCipher(engine); 
    cipher.init(true, params); 
    byte[] outputText = new byte[cipher.getOutputSize(inputData.length)]; 
    int outputLen = cipher.processBytes(inputData, 0, inputData.length, 
      inputData, 0); 
    cipher.doFinal(outputText, outputLen); 
//this is your mac 
cipher.getMac(); 
하여 찾을 수 있습니다
관련 문제