如何使用C加密文本文件?

时间:2010-08-01 13:13:06

标签: c encryption

我想要一个这样的程序:

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

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

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

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

6 个答案:

答案 0 :(得分:7)

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

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

但是,我应该警告你,如果程序和文本文件在同一台机器上,你需要在外部提供密码(例如由用户提供);嵌入在程序中的密码很容易提取,根本不提供任何安全性。如果程序无法访问(例如,它位于网络服务器上,并且有文本文件的人无法访问可执行文件),那就没问题了。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-3)

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