2010-06-29 5 views
3

Java에서 Bouncy Castle AesFastEngine으로 암호화 된 표준 C# AesCryptoServiceProvider로 데이터의 암호를 해독해야합니다. (Bounca Castle의 C# 구현을 사용하여 데이터를 해독하는 데 아무런 문제가 없습니다.)C#으로 데이터 암호화 AesCryptoServiceProvider를 BouncyCastle AesFastEngine으로 암호화

방법이 있습니까?

나는 Bouncy Castle 구현에 사용 된 IV를 찾지 못했습니다 ... 거기에 있습니까?

도움이 될 것입니다. 마르쿠스

편집 : 다음 코드는 AesFastEngine을 초기화하는 데 사용됩니다

:

BlockCipher coder = new AESFastEngine(); 
CFBBlockCipher cfbCipher = new CFBBlockCipher(coder, 8); 
StreamCipher streamCipher = new StreamBlockCipher(cfbCipher); 
streamCipher.Init(true, keyParameter); 
streamCipher.ProcessBytes(data, 0, data.Length, encodedMessageBytes, 0); 

편집 :

안녕하세요 그리스어, 귀하의 답변을 주셔서 감사합니다,하지만 여전히 작동하지 않습니다. .. here을 다운로드 할 샘플 솔루션이 있습니다.

두 개의 버튼을 클릭하면 이미 다른 암호화 된 배열을 얻을 수 있습니다 ... ???

AesManagedAlg = new AesManaged(); 
AesManagedAlg.Mode = CipherMode.CBC; 
AesManagedAlg.FeedbackSize = 8; 
AesManagedAlg.Key = key; 
// Use Test 
AesManagedAlg.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 

// Create a decrytor to perform the stream transform. 
ICryptoTransform decryptor = AesManagedAlg.CreateDecryptor(AesManagedAlg.Key, AesManagedAlg.IV); 

// Create the streams used for decryption. 
msDecrypt = new MemoryStream(cipherText); 
csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read); 

// Read the decrypted bytes from the decrypting stream 
var decryptedData = new List<byte>(); 
var buffer = new byte[1]; 
while (true) { 
    var readedBytes = csDecrypt.Read(buffer, 0, buffer.Length); 
    if(readedBytes == 0) break; 
    decryptedData.Add(buffer[0]); 
} 
ret = decryptedData.ToArray(); 

편집 :

탄력이 성으로 발생되는 배열을 해독 ...을 암호화 되 데이터가 잘못된 길이 없다는 예외 선도하고 여기에

내가 암호 해독에 쓴 코드입니다

닫기! RijndaelManaged 관리가 작동하지만 1 바이트 더 많은 암호화 된 데이터를 제공합니다. 다른 모든 바이트는 동일합니다 ... 많이 tryed하지만 탄력성이있는 마지막 바이트를 얻는 방법을 모르겠습니다 ...이 마지막 바이트가 없으면 RijndaelManaged를 사용하여 데이터를 암호 해독 할 수 없습니다 ...

+0

어떤 AES 모드를 사용 했습니까? 그냥 AesFastEngine을 사용한다고해서 충분한 정보가 없다고 말하는 것입니다. –

+0

다음 코드는 AesFastEngine을 초기화하는 데 사용됩니다. IBlockCipher coder = new AesFastEngine(); CfbBlockCipher cfbCipher = 새 CfbBlockCipher (코더, 8); IStreamCipher streamCipher = 새 StreamBlockCipher (cfbCipher); streamCipher.Init (true, keyParameter); streamCipher.ProcessBytes (data, 0, data.Length, encodedMessageBytes, 0); 충분한 정보입니까? – Markus

+0

코드를 복사하여 붙여 넣으십시오. 입력하지 마십시오. –

답변

1

사용중인 IV가 기본 IV이며 모두 0입니다. AesManaged 개체를 만들고 모드를 CipherMode.CFB으로 설정하고 FeedbackSize를 8로 설정하여 .NET에서이 작업을 수행 할 수 있어야합니다. ICryptoTransform을 생성하기 위해 CreateEncryptor 메서드를 사용하고 차례로 이것을 사용하여 CryptoStream을 만듭니다. This example은 마지막 몇 단계를 도와야합니다.

편집 :

당신이 게시 새로운 코드를 보면, 두 번째 줄은 잘못된 것입니다. CFB 모드 이 아닌CBC을 지정해야합니다. 두 번째 줄은 데이터의 readedBytes 바이트를 해독 만 평문에 buffer[0]를 추가하고 나머지는 무시하는 것 같습니다, 또한

AesManagedAlg.Mode = CipherMode.CFB; 

해야한다.

EDIT 2 : 바와 같이

, AesManaged은 CFB 모드에서 사용될 수 없지만 것은 RijndaelManaged 일 수있다.AES 알고리즘은 128 비트 블록 크기와 128, 192 또는 256 비트 키 크기로 제한된 Rijndael 알고리즘입니다. 예를 들어 비슷한 질문이있는 my answer을 참조하십시오.

+0

안녕하세요. Greg, 빠른 답변을 보내 주셔서 감사합니다. 나는 그것을 시도하고 결과를 게시 할 것입니다 ... – Markus

+0

안녕하세요 그렉, 당신에게 독일에서 timegap에도 불구 하고이 문제를 다음 주셔서 고마워요! CipherMode.CFB를 설정하려고하면 Exception : (독일어에서 tranlated) 지정한 암호화 모드가이 알고리즘에 유효하지 않습니다. ... ??? (버퍼는 1 바이트 길이이므로 버퍼 [0]은 괜찮을 것입니다.) – Markus

+0

그래, 같은 오류가 발생합니다. 하지만 RijndaelManaged와 같은 알고리즘입니다. –

관련 문제