【问题标题】:How to encrypt a text file using C?如何使用 C 加密文本文件?
【发布时间】:2011-03-23 20:49:18
【问题描述】:

我想要一个这样的程序:

scanf("%s", name);
scanf("%s", id);
scanf("%d", &age);

现在我想将nameidage写入一个文件,但是文件应该被加密,这样只有我的程序才能读回它写入的数据。

我需要使用其中一个加密库mentioned here(它们都是相当重的库,我只需要加密一个文本文件),还是有其他更简单的方法?

如果加密库是解决方案,哪一个最适合简单的文本文件加密?

【问题讨论】:

  • 如果你从文件加密开始,我建议你也考虑一下你应该把用于文件加密的密码/密钥放在哪里。

标签: c encryption


【解决方案1】:

最好使用对称密钥算法,如 AES。例如,您可以找到小的源代码here

如果您的应用程序很关键,那么您应该使用您链接到的库。

【讨论】:

    【解决方案2】:

    如果您想要安全,那么推出自己的加密库是错误的。使用完善的加密库(即使它看起来很臃肿),并将安全性及其正确实施留给专家。

    如果你会使用C++,我建议Crypto++,如果你不能使用C++,那么我建议你围绕Crypto++实现一个C包装库。另一种可能性是libcrypto,尽管它不支持 AES。

    不过,我应该警告您,如果程序和文本文件在同一台机器上,您将需要从外部提供密码(例如由用户提供);嵌入在程序中的密码很容易被提取,而且根本没有安全性。如果程序无法访问(例如,它位于网络服务器上,并且拥有文本文件的人无法访问可执行文件),那么没关系。

    【讨论】:

      【解决方案3】:

      对于您一次读/写的简单文本文件,我会使用流密码,例如RC4。

      假设您使用嵌入式密钥 RC4 很容易自己实现,或者应该有很多轻量级实现。

      【讨论】:

      • 但是您将如何使用 IV? RC4 很难做到这一点。
      • 您通常在密钥生成步骤的输入中将 IV 与密码或其他共享机密结合起来,例如将其附加或添加到密码中。
      【解决方案4】:

      您需要强加密吗?您保护文件的人是否有权访问可执行文件并具有反汇编和分析它的技能?他们有密码分析技能吗?如果没有,您可以使用非常简单的基于 XOR 的密码。

      1. 使用程序生成一个 LONG 随机字符串,例如“837es238aj983”,但比您从输入中读取的任何字符串都要长(不需要可读)。
      2. 生成一个随机整数。
      3. 将随机字符串和整数作为全局变量存储在 C 程序中。
      4. 用随机整数对您读取的每个年龄进行异或运算,并将异或值保存到文件中。
      5. 从输入中读取的字符串中的每个字符与随机字符串中相同索引处的字符进行异或。将 XORed 值保存到文件中。
      6. 当您从文件中读取值时,您会再次使用随机键进行异或运算并获得原始值。

      【讨论】:

      • -1。永远不要实施自己的加密货币。如果您需要它是安全的,请使用真正的加密货币。如果您不需要它的安全性,请不要首先对其进行加密。
      【解决方案5】:

      如果您使用的是 Windows,请考虑使用 C 和 C++ 都提供的 Windows 加密 API:

      http://msdn.microsoft.com/en-us/library/windows/desktop/aa382358(v=vs.85).aspx

      【讨论】:

        【解决方案6】:
        Public Class Tester
            Public Shared Sub Main()
                Try
                    Dim myDESProvider As DESCryptoServiceProvider = New DESCryptoServiceProvider()
                    myDESProvider.Key = ASCIIEncoding.ASCII.GetBytes("12345678")
                    myDESProvider.IV = ASCIIEncoding.ASCII.GetBytes("12345678")
                    Dim myICryptoTransform As ICryptoTransform = myDESProvider.CreateEncryptor(myDESProvider.Key, myDESProvider.IV)
                    Dim ProcessFileStream As FileStream = New FileStream("Encrypted.txt", FileMode.Open, FileAccess.Read)
                    Dim ResultFileStream As FileStream = New FileStream("Decrypted.txt", FileMode.Create, FileAccess.Write)
                    Dim myCryptoStream As CryptoStream = New CryptoStream(ResultFileStream, myICryptoTransform, CryptoStreamMode.Write)
                    Dim bytearrayinput(ProcessFileStream.Length - 1) As Byte
                    ProcessFileStream.Read(bytearrayinput, 0, bytearrayinput.Length)
                    myCryptoStream.Write(bytearrayinput, 0, bytearrayinput.Length)
                    myCryptoStream.Close()
                    ProcessFileStream.Close()
                    ResultFileStream.Close()
                 Catch ex As Exception
                    Console.WriteLine(ex.Message)
                End Try
                Console.ReadLine()
            End Sub
        End Class
        

        【讨论】:

        • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。
        猜你喜欢
        • 2011-06-21
        • 2011-05-10
        • 1970-01-01
        • 2015-06-12
        • 2015-08-06
        • 1970-01-01
        • 2022-01-27
        • 2012-04-14
        • 1970-01-01
        相关资源
        最近更新 更多