送分啦!(有关文件操作,加密)(100分)

  • 主题发起人 主题发起人 davidchangzheng
  • 开始时间 开始时间
D

davidchangzheng

Unregistered / Unconfirmed
GUEST, unregistred user!
本人有一个很菜的问题,希望大虾们指点

我想对一个文件全文(txt文件或者二进制文件)进
行加密,采用rsa算法加密。我的思路是:每次从文件
中读取定长字节的内容(如8bit),然后将其转化为对
应的数值,然后对数值进行加密算法,得到一个新的值
解密时候将该值进行相关运算得到加密前的值。
由于本人水平有限,有如下困难:
1。怎样定长地从文件中读取数据,文件中包括各种
字符,当然还有中文。(如有控件更好)
中文是双字节的我不知道会不会因为读半个字节造成
不良后果。
2。读取的字符(字母,中文)转化为数值时,是转化
为相应的ASCII(中文怎么转换?)码好呢,还是其他,
3。解密的时候,如果是中文的会不会正确显示中文信息


先问到这儿,小弟银子太少先送上100两,解决后如果银子
增长了,再加上。先谢了!email:davidchangzheng@263.net

 
>>每次从文件中读取定长字节的内容(如8bit)
8bytes吧。+

procedure TForm1.Button1Click(Sender: TObject);
var
F: TFileStream;
buffer:array[0..7] of char;
Return_Num:integer;
begin
if OpenDialog1.Execute then
begin
F:=TFileStream.create(opendialog1.filename,fmCreate);
//do something
Return_Num:=F.Read(buffer,8);//当在文件的最后时,Return可能小于8
...
F.free;
end;
end;
 
>>能否正确显示中文?
如果你的解密算法可以把文件还原得和原来的丝毫不差,怎么可能会有问题?
中文字符整个是WideChar类型,其实就是String,半个是Leadbyte类型,但是我觉得
(个人意见)不必去判断是否是中文,当作普通字符处理就可以了。
加密很多用到位操作,建议转化为二进制数。
 
网络除了点问题,好久没来让大家就等了,sorry
to:victorim
有乱码,怎样判断是在行尾,比如当读到行尾时不能正好填满buffer怎么办;
假如我想将读出来(还没有加密)的东西还原成原来的文本(如:文本文件)怎样
从buffer中判断出哪儿是行结尾。即怎样正确无误的还原;

to:nutty
给我介绍一下文本文件和二进制文件的差别以及怎么互相转换

谢谢二位 david
 
定长地从文件中读取数据可用函数copy().用此函数不用考虑(字母,中文)
把数据放到一个数组中再进行加密,解密。
 
所谓二进制文件,和 文本文件,只是人为定义的,
二进制文件中有超过 127 的字符,也就是说包含不是 ascii 的
字符,而文本文件全是 ascii 字符。

FileStream.Position = FilsStream.size ?
 
不用考虑行结尾,都是ascii.还原出来后直接显示出来就行.

BTW 行结尾: #13#10 或 char(13)+char(10)
 
各位继续:

假如以文本文件为例,当然我可以一次读一行来显示在tmemo空件中,但是为了加
密方便我要定长的读取,显然我可以将其放在一个数组中。但是我怎么能使其解密后
按照原来的行列格式显示(如:跟原来的文本一样,在原来文本中相同的地方行),
而不是都显示在同一行中,或者将原来的一行的内容分别显示在不同的行。
 
根本就不需考虑文件的存储格式,就是把文件看作二进制文件就可以了。
 
Agree to Victortim and SuperMMX
 
用做二进制即可
 
你根本就无需考虑文件换行的问题,因为换行实际上是 ASCII 码为 13、10 的两个字
符,只要你的算法是可逆的,那么,在还原加密文件后,换行仍然会保留,不会存在你说的
变成一行的问题。
 
多人接受答案了。
 
后退
顶部