2

文字列を暗号化するには、約100,000の異なる方法があります。AES、CBC、PKCS7などの標準を使用すると、作業が簡単になりますが、IVにはまだ問題があります。ソルト、エンコーディングなど(www.Crypto.Stackexchange.comに記載されているとおり)

私のiOSプロジェクト(Obj-C)では、文字列を暗号化するための簡単で十分に文書化された方法であるFBEncryptorプロジェクトを使用しています。ただし、Windowsプラットフォーム(できればVB.NET)でFBEncryptorによって生成されたiOSAES文字列を復号化できるコードが必要です。

FBEncryptorと互換性のあるVB.NET用の別のプロジェクトをまだ見つけていません。

FBEncryptorで動作するVB.NET暗号化プロジェクトを知っている人はいますか?そうでない場合は、Rijndaelマネージドライブラリ(Microsoftが提供)をFBEncryptorで動作させるために何をする必要がありますか?

Rijndael Managedを使用した私のVB.NETコード:

Imports System.Security
Imports System.Security.Cryptography
Imports System.IO
Imports System.Runtime.InteropServices
Imports System.Text.RegularExpressions
Imports System.Text


Module Encrypt2
Public saltBytes As Byte()
Dim hashAlgorithm As String = "SHA1"

Public Sub GenerateSalt()
    ' Define min and max salt sizes.
    Dim minSaltSize As Integer
    Dim maxSaltSize As Integer

    minSaltSize = 8
    maxSaltSize = 8

    ' Generate a random number for the size of the salt.
    Dim random As Random
    random = New Random()

    Dim saltSize As Integer
    saltSize = random.Next(minSaltSize, maxSaltSize)

    ' Allocate a byte array, which will hold the salt.
    saltBytes = New Byte(saltSize - 1) {}

    ' Initialize a random number generator.
    Dim rng As RNGCryptoServiceProvider
    rng = New RNGCryptoServiceProvider()

    ' Fill the salt with cryptographically strong byte values.
    rng.GetNonZeroBytes(saltBytes)
End Sub

Public Function Encrypt(ByVal plainText As String, ByVal keyword As String) As String
    Dim hashAlgorithm As String = "SHA1"
    Dim passwordIterations As Integer = 128
    Dim initVector As String = "@7781157e2629b09"
    Dim keySize As Integer = 256

    Dim initVectorBytes As Byte() = Encoding.ASCII.GetBytes(initVector)

    Dim plainTextBytes As Byte() = Encoding.ASCII.GetBytes(plainText)

    GenerateSalt()

    Dim password As New Rfc2898DeriveBytes(keyword, saltBytes, passwordIterations)

    Dim keyBytes As Byte() = password.GetBytes(keySize \ 8)
    Dim symmetricKey As New RijndaelManaged()

    symmetricKey.Mode = CipherMode.CBC

    Dim encryptor As ICryptoTransform = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes)

    Dim memoryStream As New MemoryStream()
    Dim cryptoStream As New CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)

    cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length)
    cryptoStream.FlushFinalBlock()
    Dim cipherTextBytes As Byte() = memoryStream.ToArray()
    memoryStream.Close()
    cryptoStream.Clear()

    Dim cipherText As String = Convert.ToBase64String(cipherTextBytes)

    Return (cipherText)

End Function

Public Function Decrypt(ByVal cipherText As String, ByVal keyword As String) As String

    Dim hashAlgorithm As String = "SHA1"

    Dim passwordIterations As Integer = 128
    Dim initVector As String = "@7781157e2629b09"
    Dim keySize As Integer = 256

    ' Convert strings defining encryption key characteristics into Byte
    ' arrays. Let us assume that strings only contain ASCII codes.
    ' If strings include Unicode characters, use Unicode, UTF7, or UTF8
    ' encoding

    Dim initVectorBytes As Byte() = Encoding.ASCII.GetBytes(initVector)

    ' Convert the Ciphertext into a Byte array
    Dim cipherTextBytes As Byte() = Encoding.ASCII.GetBytes(cipherText)

    ' First we must create a password, from which the key will be 
    ' derived. This password will be generated from the specified
    ' passphrase and salt value. The password will be created using 
    ' the specified hash algorithm. Password creation can be done in 
    ' several iterations
    GenerateSalt()
    Dim password As New Rfc2898DeriveBytes(keyword, saltBytes, passwordIterations)

    ' Use the password to generate pseudo-random bytes for the encryption
    ' key. Specify the size of the key in bytes (instead of bits)

    Dim keyBytes As Byte() = password.GetBytes(keySize \ 8)

    ' Create uninitialized Rijndael encryption object

    Dim symmetricKey As New RijndaelManaged()

    ' It is reasonable to set encryption mode to Cipher Block Chaining
    ' (CBC). Use default options for other symmetric key parameters.
    symmetricKey.Mode = CipherMode.CBC

    ' Generate decryptor from the existing key bytes and initialization
    ' vector. Key size will be defined based on the number of the key
    'bytes

    Dim decryptor As ICryptoTransform = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes)

    ' Define memory stream which will be used to hold encrypted data.

    Dim memoryStream As New MemoryStream(cipherTextBytes)

    ' Define cryptographic stream (always user Read mode for encryption).
    Dim cryptoStream As New CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)


    ' Since at this point we don't know what the size of decrypted data
    ' will be, allocate the buffer long enough to hold ciphertext;
    ' plaintext is never longer than ciphertext
    Dim plainTextBytes As Byte() = New Byte(cipherTextBytes.Length - 1) {}

    ' Start decrypting.
    Dim decryptedByteCount As Integer = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length)

    ' Close both streams
    memoryStream.Close()
    cryptoStream.Close()

    ' Convert decrypted data into a string
    ' Let us assume that the original plaintext string was UTF8-Encoded.
    Dim plainText As String = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount)

    ' Return the decrypted string
    Return (plainText)


End Function

End Module

IVが静的であり、パスワードの反復が少ないことに気付くでしょう。これは、FBEncryptorと同じ方法でIVを生成する方法がわからないためです。また、復号化しようとすると、バイト長に問題があることに気付くかもしれません。

どんな助けでもありがたいです!ありがとう!

4

1 に答える 1

2

1 つのメモ。FBEncryptor を調べました。それはいくつかの悪い習慣を使用しています。したがって、セキュリティが重要な場合は、それについてもう少し読んで、暗号化を行う別のコードを選択することをお勧めします (または自分で作成します)。

FBEncryptor は暗号化のために次のことを行います a) 文字列をバイト配列に変換します (UTF8 エンコーディングに基づきます) b) キーをバイト配列に変換します (UTF エンコーディングに基づきます)。c) キーの最初の 16 バイトのみをコピーする d) 0x00 の 16 ビットである IV を作成する e) 項目 a) からのバイト配列を暗号化する a) d) で作成された IV で AES/CBC/PKCS7Padding を使用する f) 結果の暗号化されたデータは Base64 に変換されます

そして、復号化のために次のことを行います a) 暗号化文字列を Base64 からバイト配列に変換します b) キーをバイト配列に変換します (UTF エンコーディングに基づく)。c) キーの最初の 16 バイトのみをコピーする d) 0x00 の 16 ビットである IV を作成する e) 項目 a) からバイト配列を復号化する a) d) で作成された IV で AES/CBC/PKCS7Padding を使用する f) 暗号化されたデータを e) から a に変換するUTF8 エンコーディングを使用した文字列

VB.NET でもまったく同じことを行う必要があります。ほとんどすべての部品があると思います-すべてのSHA1およびsalt関連のものを削除し、ステップb)と同等のものを使用する必要があります。また、VB.NET の PKCS7Padding を調査する必要があります。

于 2012-08-23T22:00:53.470 に答える