加密一个整数

zggxyx2004 2014-11-18 02:03:30
我遇到的一个问题请教下大家,
要求把一个整数(最长10位)加密成新的整数之后把新的整数保存起来,并且在下次读取出来之后能正确解密,简单理解就类似下面的连接
http://www.2cto.com/kf/201208/147614.html
但连接中的方法不完善,它要求解密时也必须知道它原数据的长度,如果不知道原数据的长度的话就不能解密成功,比如一个4位数1234,加密后变成0027,如果长度不固定,解密时会丢掉两位,我希望类似的方法可以对任意长度的整数进行加密。

大家觉得我的想法可行吗?

或者大家给我提示提示,有意义的建议都给分。
...全文
373 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zggxyx2004 2014-11-19
  • 打赏
  • 举报
回复
哈哈,综合大家的提示我自己整理了新的加密方式,谢谢大家。
707wk 2014-11-18
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
仅供参考
#include <stdio.h>
#include <string.h>
#include <conio.h>
FILE *fi,*fo;
int i;
int main(int argc,char **argv) {
    if (argc<3) {
        printf("Usage:%s src des\n",argv[0]);
        return 1;
    }
    if (0==stricmp(argv[1],argv[2])) {
        printf("Src and des is same!\n");
        return 2;
    }
    fo=fopen(argv[2],"wb");
    if (NULL==fo) {
        printf("Can not create file %s\n",argv[2]);
        return 3;
    }
    fi=fopen(argv[1],"rb");
    if (NULL==fi) {
        fclose(fo);
        printf("Can not find file %s\n",argv[1]);
        return 4;
    }
    i=0;
    fseek(fi,-1L,SEEK_END);
    while (1) {
        fputc(fgetc(fi)^0x5A,fo);
        i++;
        if (i%1000000==0) cprintf("\r%dKB",i/1000);
        if (fseek(fi,-2,SEEK_CUR)) break;
    }
    fclose(fi);
    fclose(fo);
    cprintf("\r%dKB OK.\r\n",i/1000);
    return 0;
}
收藏了
勤奋的小游侠 2014-11-18
  • 打赏
  • 举报
回复
引用 6 楼 zggxyx2004 的回复:
引用 5 楼 lovesmiles 的回复:
整型就是int,4字节。也就是char[4].将int当作4个char对字节单独加密。这样就不存在长度的问题了。
你的建议类似4楼的。我理解你的意思是这样的,比如内存中的一个变量值为1000,存储它的时候需要把它的每个字节进行加密操作(类似^0x5A)后再把加密后的整个数值往存储器上写,而读取出来的int(即4个char)又需要每个字节进行解密(类似^0x5A))之后才能转为最终结果100,应该是这么理解吧?感觉操作起来比较麻烦吧。感觉效果可以。
这样还麻烦?那你干脆将一个数字平均分成二部份,互换一下位置就好了。
赵4老师 2014-11-18
  • 打赏
  • 举报
回复
4楼是异或0x5a且倒序。
zggxyx2004 2014-11-18
  • 打赏
  • 举报
回复
引用 5 楼 lovesmiles 的回复:
整型就是int,4字节。也就是char[4].将int当作4个char对字节单独加密。这样就不存在长度的问题了。
你的建议类似4楼的。我理解你的意思是这样的,比如内存中的一个变量值为1000,存储它的时候需要把它的每个字节进行加密操作(类似^0x5A)后再把加密后的整个数值往存储器上写,而读取出来的int(即4个char)又需要每个字节进行解密(类似^0x5A))之后才能转为最终结果100,应该是这么理解吧?感觉操作起来比较麻烦吧。感觉效果可以。
勤奋的小游侠 2014-11-18
  • 打赏
  • 举报
回复
整型就是int,4字节。也就是char[4].将int当作4个char对字节单独加密。这样就不存在长度的问题了。
赵4老师 2014-11-18
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <string.h>
#include <conio.h>
FILE *fi,*fo;
int i;
int main(int argc,char **argv) {
    if (argc<3) {
        printf("Usage:%s src des\n",argv[0]);
        return 1;
    }
    if (0==stricmp(argv[1],argv[2])) {
        printf("Src and des is same!\n");
        return 2;
    }
    fo=fopen(argv[2],"wb");
    if (NULL==fo) {
        printf("Can not create file %s\n",argv[2]);
        return 3;
    }
    fi=fopen(argv[1],"rb");
    if (NULL==fi) {
        fclose(fo);
        printf("Can not find file %s\n",argv[1]);
        return 4;
    }
    i=0;
    fseek(fi,-1L,SEEK_END);
    while (1) {
        fputc(fgetc(fi)^0x5A,fo);
        i++;
        if (i%1000000==0) cprintf("\r%dKB",i/1000);
        if (fseek(fi,-2,SEEK_CUR)) break;
    }
    fclose(fi);
    fclose(fo);
    cprintf("\r%dKB OK.\r\n",i/1000);
    return 0;
}
zggxyx2004 2014-11-18
  • 打赏
  • 举报
回复
引用 1 楼 zhouxiaofeng1021 的回复:
你保存为字符串,然后求出字符串长度 不就是数字长度? 是这样吗?
我明白你的意思,我保存数据的地方不是以文件形式保存的,要保存到铁电中,所以存储的数据类型不能是字符串类型。
zggxyx2004 2014-11-18
  • 打赏
  • 举报
回复
补充一下:因为加密跟解密整数时不是在同一个时候进行的,比如加密时是上次程序运行时进行的,而解密时则是本次程序启动时所需要进行的,所以程序本身的内存变量没办法记录所需要解密的数值的长度,并且我又不希望通过持久记录的方式记录每个加密后的数据长度来达到目的,因为要加密的数据实在太多了。
zhouxiaofeng1021 2014-11-18
  • 打赏
  • 举报
回复
你保存为字符串,然后求出字符串长度 不就是数字长度? 是这样吗?

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧