gpt4 book ai didi

ios - Obj-C 和 VB.Net 之间的加密兼容性

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:24 25 4
gpt4 key购买 nike

加密字符串的方法大约有 100,000 种。使用 AES、CBC 和 PKCS7 等标准可以使事情变得更容易——但 IV 仍然存在问题。盐、编码等(如 www.Crypto.Stackexchange.com 所述)

对于我的 iOS 项目 (Obj-C),我正在使用 FBEncryptor project这是一种加密字符串的简单且有据可查的方法。但是,我需要能够解密 FBEncryptor 在 Windows 平台上生成的 iOS AES 字符串的代码 - 最好是 VB.NET。

我还没有找到另一个与 FBEncryptor 兼容的 VB.NET 项目。

有人知道任何与 FBEncryptor 一起工作的 VB.NET 加密项目吗?如果不是,那么我需要做什么才能使 Rijndael 托管库(由 Microsoft 提供)与 FBEncryptor 一起使用?

我的 VB.NET 代码使用 Rijndael Managed :

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。您可能还会注意到,在尝试解密时,字节长度存在问题。

任何帮助将不胜感激!谢谢!

最佳答案

一张纸条。我查看了 FBEncryptor。它使用了一些不好的做法。因此,如果安全性对您很重要,我建议您阅读更多相关内容并选择另一个进行加密的代码(或自行编写)。

FBEncryptor 做以下加密a) 字符串转字节数组(基于UTF8编码)b) 将 key 转换为字节数组(基于 UTF 编码)。c) 仅复制 key 的前 16 个字节d) 创建 IV,它是 0x00 的 16 个字节e) 使用 AES/CBC/PKCS7Padding 和在 d) 中创建的 IV 加密项目 a) 中的字节数组f) 将得到的加密数据转为Base64

它会进行以下解密a) 将加密字符串从 Base64 转换为字节数组b) 将 key 转换为字节数组(基于 UTF 编码)。c) 仅复制 key 的前 16 个字节d) 创建 IV,它是 0x00 的 16 个字节e) 使用 AES/CBC/PKCS7Padding 和在 d) 中创建的 IV 解密项目 a) 中的字节数组f) 使用 UTF8 编码将 e) 中的加密数据转换为字符串

您应该在 VB.NET 中做完全相同的事情。我想你几乎所有的部分- 您将需要删除所有 SHA1 和盐相关的东西并使用步骤 b) 的等价物。你需要研究 PKCS7Padding for VB.NET

关于ios - Obj-C 和 VB.Net 之间的加密兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12030874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com