2009-04-06 5 views
3

내 문제는 VB.NET에서 AES를 사용하는 것보다 실제로 좀 더 복잡합니다. 실제로 내가하려고하는 것은 Java 응용 프로그램 내에서 VB.NET의 AES를 사용하는 것입니다. 야곱. 그러나 지금 당장은 AES 구현 그 자체에 집중해야합니다.VB.NET에서 AesCryptoServiceProvider 사용

여기 한 번 다시 자바 코드 내 암호화 코드

Public Function EncryptAES(ByVal toEncrypt As String, ByVal key As String) As Byte() 
    Dim keyArray = Convert.FromBase64String(key) 
    Dim toEncryptArray = Encoding.Unicode.GetBytes(toEncrypt) 

    Dim aes = New AesCryptoServiceProvider 
    aes.Key = keyArray 
    aes.Mode = CipherMode.ECB 
    aes.Padding = PaddingMode.ISO10126 
    Dim encryptor = aes.CreateEncryptor() 

    Dim encrypted = encryptor.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length) 
    aes.Clear() 

    Return encrypted 
End Function 

, 난 16 진수 문자열로 바이트 배열을 켜십시오. 내가 암호 해독 코드를 실행하면

지금, 과정을 반대로, 나는 여기

패딩이 유효하지 다음과 같은 오류 메시지가 제거 할 수 없습니다, 내 암호 해독 코드

Public Function DecryptAES(ByVal toDecrypt As String, ByVal key As String) As Byte() 
    Dim keyArray = Convert.FromBase64String(key) 
    Dim toDecryptArray = Convert.FromBase64String(toDecrypt) 

    Dim aes = New AesCryptoServiceProvider 
    aes.Key = keyArray 
    aes.Mode = CipherMode.ECB 
    aes.Padding = PaddingMode.ISO10126 
    Dim decryptor = aes.CreateDecryptor() 

    Dim decrypted = decryptor.TransformFinalBlock(toDecryptArray, 0, toDecryptArray.Length) 
    aes.Clear() 
    Return decrypted 
End Function 

입니다.

+0

암호화 된 데이터를 어딘가에 저장 한 다음 저장된 데이터를 Java를 통해 전달한 후 해독 기능 호출로 비교했습니다. –

+0

또한 : vb.net/visual studio의 버전은 무엇입니까? –

+0

Visual Studio 2008 Pro 암호 해독에서 테스트 결과 값을 얻지 못해 제안한 테스트를 수행 할 수 없습니다. 내 VB 암호 해독 기능에 의해 오류가 발생하고 있습니다. –

답변

0

좋아, 원래 코드에 몇 가지 문제가있었습니다.

하나는 디버깅하지 않습니다. 내 코드를 Java로 래핑하기 전에 암호화하고 해독 할 수 있는지 확인하기 위해 내부 테스트를 추가해야했습니다. 그건 내 바보 같았 어.

두 가지 : encryptor 및 decryptor 개체의 TransformFinalBlock 메서드가 보급 된 것처럼 작동하지 않는 것 같습니다.

충분하게 이야기합니다. 여기서 코드

Public Function EncryptAES(ByVal clearText As String, ByVal key As String) As String 

    ' prepare input 
    Dim keyBytes = Convert.FromBase64String(key) 
    Dim sourceBytes = Encoding.Unicode.GetBytes(clearText) 

    ' prepare encryption provider 
    Dim aes = New AesCryptoServiceProvider 
    aes.Key = keyBytes 
    aes.Mode = CipherMode.ECB 
    aes.Padding = PaddingMode.ISO10126 
    Dim encryptor = aes.CreateEncryptor() 

    Dim ms = New MemoryStream 
    Dim cs = New CryptoStream(ms, encryptor, CryptoStreamMode.Write) 
    cs.Write(sourceBytes, 0, sourceBytes.Length) 
    cs.FlushFinalBlock() 
    Dim encrypted = Convert.ToBase64String(ms.ToArray()) 

    'Dim decrypted = DecryptAES(encrypted, key) 
    'If Not EventLog.SourceExists("CryptoBridge") Then 
    ' EventLog.CreateEventSource("CryptoBridge", "CryptoBridge") 
    'End If 
    'Dim log As New EventLog 
    'log.Source = "CryptoBridge" 
    'log.WriteEntry(clearText & ":" & decrypted) 

    aes.Clear() 
    cs.Dispose() 
    ms.Dispose() 

    Return encrypted 
End Function 

Public Function DecryptAES(ByVal base64Cipher As String, ByVal key As String) As String 
    Dim keyBytes = Convert.FromBase64String(key) 
    Dim cipherBytes = Convert.FromBase64String(base64Cipher) 

    ' prepare decryption provider 
    Dim aes = New AesCryptoServiceProvider 
    aes.Key = keyBytes 
    aes.Mode = CipherMode.ECB 
    aes.Padding = PaddingMode.ISO10126 
    Dim decryptor = aes.CreateDecryptor() 

    Dim ms = New MemoryStream(cipherBytes) 
    Dim cs = New CryptoStream(ms, decryptor, CryptoStreamMode.Read) 

    Dim decryptedBytes As Byte() 
    ReDim decryptedBytes(cipherBytes.Length) 

    Dim readByteCount = cs.Read(decryptedBytes, 0, decryptedBytes.Length) 
    Dim decrypted = Encoding.Unicode.GetString(decryptedBytes, 0, readByteCount) 

    aes.Clear() 
    cs.Dispose() 
    ms.Dispose() 

    Return decrypted 
End Function 

다음, 난 초기 값 (IV)의 값을 필요로 256 비트 및 CBC 암호화 모드로 AES 알고리즘을 높힐 코드 수정 될 것이다. 이로 인해 나머지 부분이 100 % 작동 할 때까지 추가 할 준비가되지 않은 구현 수준의 복잡성이 추가됩니다.

내 문제에 대해 의견을 보내 주신 모든 분들께 감사드립니다.

+0

호기심 - 왜 Java에 포함 된 AES 암호 만 사용하지 않습니까? JACOB을 건너는 것과 반대되는 것? – Cheeso