【问题标题】:Create Binary file of text that notepad can't read创建记事本无法读取的文本的二进制文件
【发布时间】:2025-12-30 21:20:14
【问题描述】:

我正在尝试在 Windows 中创建记事本无法读取的二进制文件。该文件需要包含文本信息。我运行的当前代码在记事本中是可读的(这里和那里有一些额外的字符,但仍然是人类可读的)。非常感谢任何帮助。

Using writer As BinaryWriter = New BinaryWriter(File.Open("file.bin", FileMode.Create))
        writer.Write(rtbWriter.Text)
End Using

【问题讨论】:

  • 您可能想用什么来解释您正在尝试做什么,而不是如何。这是一个 XY 问题,因为它相当于 我想制造一辆汽车,而不是用汽油运行并在其中加油如果您将文本放入文件中,记事本将看到它并显示和用户可以阅读。
  • @Plutonix 我确实说过。本质上,我试图限制对带有密钥文件的程序的访问。我希望能够构建一个包含“用户 X,访问 Y”等数据的密钥文件。但我不希望任何用户能够打开文件并在文本编辑器中查看并更改它。当前项目是密钥文件生成器。我需要该程序的用户才能输入“用户 X,访问 Y”,然后程序将其转换为 txt 编辑器不会自动转换回来的某种二进制字符。

标签: vb.net binarywriter


【解决方案1】:

所有文件都可以被记事本读取——不管是不是二进制文件。如果您不希望文本可读(或更准确 - 易于理解),请考虑使用加密。

编辑:有关如何使用加密的介绍,请参阅下面的链接以了解如何在 VB.NET 中使用 3DES 加密服务提供程序: simple encrypting / decrypting in VB.Net

【讨论】:

【解决方案2】:

*更复杂的方法将文件流和加密流链接在一起......

...但这里有一个非常简单的示例,展示了如何加密/解密单个字符串,这样你就有了可以玩和学习的东西:

Imports System.IO
Imports System.Text
Imports System.Security.Cryptography

Public Class Form1

    Private Key As String = "SomeRandomKeyThatIsHardCoded"

    Private data As New List(Of String)
    Private DataFileName As String = System.IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "SomeFile.txt")

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Some data to play with:
        data.Add("User X, Access Y")
        data.Add("User Y, Access Z")
        data.Add("User Z, Access A")
        ListBox1.DataSource = data
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' Write out each entry in encrypted form:
        Using SW As New StreamWriter(DataFileName, False)
            For Each entry As String In data
                SW.WriteLine(Crypto.Encrypt(entry, Key))
            Next
        End Using
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        data.Clear()
        ListBox1.DataSource = Nothing

        ' Read each encrypted line and decrypt it:
        Using SR As New System.IO.StreamReader(DataFileName)
            While Not SR.EndOfStream
                data.Add(Crypto.Decrypt(SR.ReadLine, Key))
            End While
        End Using

        ListBox1.DataSource = data
    End Sub

End Class

Public Class Crypto

    Private Shared DES As New TripleDESCryptoServiceProvider
    Private Shared MD5 As New MD5CryptoServiceProvider

    Public Shared Function MD5Hash(ByVal value As String) As Byte()
        Return MD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(value))
    End Function

    Public Shared Function Encrypt(ByVal stringToEncrypt As String, ByVal key As String) As String
        DES.Key = Crypto.MD5Hash(key)
        DES.Mode = CipherMode.ECB
        Dim Buffer As Byte() = ASCIIEncoding.ASCII.GetBytes(stringToEncrypt)
        Return Convert.ToBase64String(DES.CreateEncryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))
    End Function

    Public Shared Function Decrypt(ByVal encryptedString As String, ByVal key As String) As String
        Try
            DES.Key = Crypto.MD5Hash(key)
            DES.Mode = CipherMode.ECB
            Dim Buffer As Byte() = Convert.FromBase64String(encryptedString)
            Return ASCIIEncoding.ASCII.GetString(DES.CreateDecryptor().TransformFinalBlock(Buffer, 0, Buffer.Length))
        Catch ex As Exception
            Return ""
        End Try
    End Function

End Class

【讨论】: