免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: OwnWaterloo
打印 上一主题 下一主题

[C] 思考题:语言是工具?重要是思想?那如何表达思想?(修改版) [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
41 [报告]
发表于 2011-10-26 12:19 |只看该作者
本帖最后由 OwnWaterloo 于 2011-10-26 12:51 编辑

回复 30# mirnshi

要不我再出个题目?

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(int argc, char* argv[])
  4. {
  5.       FILE* ifile = fopen(argv[1], "rb");
  6.       FILE* ofile = fopen(argv[2], "wb");

  7.       unsigned char* key = (unsigned char*)argv[3];
  8.       size_t len = strlen(argv[3]);

  9.       unsigned char S[256];
  10.       int i,j,c;
  11.       for (i=0; i<256; ++i) S[i] = i;
  12.       for (i=0, j=0; i<256; ++i)
  13.       {
  14.             unsigned k;
  15.             j = (j+key[i%len]+S[i]) % 256;
  16.             k = S[i]; S[i] = S[j]; S[j] = k;
  17.       }
  18.       i = j = 0;

  19.       for (; c=getc(ifile), c!=EOF; )
  20.       {
  21.             unsigned k, byte;
  22.             i = (i+1) % 256;
  23.             j = (j+S[i]) % 256;
  24.             k = S[i]; S[i] = S[j]; S[j] = k;

  25.             byte = S[ (S[i]+S[j]) % 256 ];
  26.             putc(c ^ byte, ofile);
  27.       }

  28.       fclose(ofile);
  29.       fclose(ifile);

  30.       return 0;
  31. }
复制代码
上面的代码是用rc4算法对文件(argv[1])加密,存储到文件(argv[2])中。
rc4算法: http://en.wikipedia.org/wiki/RC4
第1个循环对应文中的 The key-scheduling algorithm (KSA), 根据key初始化一个数组。
第2个循环对应文中的 The pseudo-random generation algorithm (PRGA) , 从数组中产生一个byte流,将byte流与文件流逐个异或得到密文。


算法细节不是重点。现在的问题是,上面代码只是一个程序,如何将它设计为一个可供其他程序复用的
同样, 我们只是想表达 rc4 算法的思想, 语言不限。

====== 补充 ======
rc4算法包括如何通过key初始化一个数组,以及如何通过该数组产生一个byte流。

而上面的代码在产生byte流的同时,也同时进行了不属于rc4算法本身的操作 —— 与文件流异或。
如何将rc4算法从这个算法的使用中剥离出来? 使该算法可以复用。比如加密字符串什么的。

i := 0
j := 0
while GeneratingOutput:
    i := (i + 1) mod 256
    j := (j + S[ i ]) mod 256
    swap values of S[ i ] and S[j]
    K := S[(S[ i ] + S[j]) mod 256]
    output K
endwhile

这就是产生byte流的算法。
但是,我就明说了,C语言没法直接表达这一算法/思想。 注意那个 output K。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
42 [报告]
发表于 2011-10-26 12:21 |只看该作者
回复 32# 三月廿七

>> C++ 一心想摈弃指针,只不过Java 做的更彻底一点, 这么个壮举竟然还被人经常视为软肋...

摈弃指针的说法是从哪来的?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
43 [报告]
发表于 2011-10-26 12:28 |只看该作者
回复 33# btdm123

我从没将oo看作是必要的,是过程的替代品。
而且我不知道为什么会有人在看了oo的书后会产生这样的想法 —— 所以我在上面说"我讨厌某些人的oo观"。

实际的例子太庞大,比如上面提到的linux vfs,不便展开。简化的例子又容易被误解。
你能体会这其中的该尬么……


最后,我举的例子当中包含的东西,你不见得就在oo书中看到过。
不要被熟悉的描述蒙蔽了,其实我是反oo分子……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
44 [报告]
发表于 2011-10-26 12:30 |只看该作者
回复 36# btdm123

>> 可以理直气壮一口咬定这个类以外的部分和这个错误一定没有关系
知道反射吗?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
45 [报告]
发表于 2011-10-26 12:56 |只看该作者
回复 28# 狗气球

我以前没能从你所说的那个角度去想。

关于译本,我帮你补充个例子。
汉语有妖、魔、鬼、怪,还有魑魅魍魉(嗯,连我自己都分不清它们的区别……),但如果都翻译为ghost,味道全丢了……

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
46 [报告]
发表于 2011-10-26 13:04 |只看该作者
回复 41# OwnWaterloo


    看了你们聊这么久,很多东西很模糊。这段代码如果给我来改成可以复用的话,我会改成下面的代码,至于什么库不库的不知道
  1. #include <stdio.h>
  2. #include <string.h>

  3. //int main(int argc, char* argv[])
  4. int* rc4(const int* iBuf, int ilen, const unsigned char* key)
  5. {
  6.       //FILE* ifile = fopen(argv[1], "rb");
  7.       //FILE* ofile = fopen(argv[2], "wb");

  8.       //unsigned char* key = (unsigned char*)argv[3];
  9.       //size_t len = strlen(argv[3]);

  10.           size_t len = strlen(key);

  11.       unsigned char S[256];
  12.       int i,j,c;
  13.       for (i=0; i<256; ++i) S[i] = i;
  14.       for (i=0, j=0; i<256; ++i)
  15.       {
  16.             unsigned k;
  17.             j = (j+key[i%len]+S[i]) % 256;
  18.             k = S[i]; S[i] = S[j]; S[j] = k;
  19.       }
  20.       i = j = 0;

  21.       //for (; c=getc(ifile), c!=EOF; )
  22.           int n;
  23.           int* oBuf;
  24.           malloc(oBuf, ilen*sizeof(int));
  25.           for (n=0; n<iLen; ++n)
  26.       {
  27.             unsigned k, byte;
  28.                         c = iBuf[n];
  29.             i = (i+1) % 256;
  30.             j = (j+S[i]) % 256;
  31.             k = S[i]; S[i] = S[j]; S[j] = k;

  32.             byte = S[ (S[i]+S[j]) % 256 ];
  33.             //putc(c ^ byte, ofile);
  34.                         oBuf[n] = c ^ byte;
  35.       }

  36.       //fclose(ofile);
  37.       //fclose(ifile);

  38.       //return 0;

  39.           return oBuf;
  40. }
复制代码
至于好不好,对不对也不是很清楚,让大家笑话吧

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
47 [报告]
发表于 2011-10-26 13:11 |只看该作者
回复 46# rover12421

这种设计需要:
1. 获得需要加密的全部明文存放在 iBuf 中
2. 调用函数, 一次性全部加密
因为函数返回后,S数组中的状态就没有了。下次进入函数会是新的状态。

上面的分析对吗?


那么,如何加密一些超大的,没法全部读入内存的文件?

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
48 [报告]
发表于 2011-10-26 13:24 |只看该作者
一本小说也没有限定只能有某种语言的版本。但不同语言的译本是不同的。
    翻译永远都是再创 ...
狗气球 发表于 2011-10-26 09:50


自然语言和计算机语言还是有区别的。

从高级语言到低级汇编语言可以精确翻译。无论是否要上升到数学高度,计算机语言所表达的思想,都应该是可以传递的,而且是精确传递。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
49 [报告]
发表于 2011-10-26 13:25 |只看该作者
我认为有。只不过JAVA把指针伪装了起来,我个人认为这种包装极其失败,相对C的指针来说是点金成铁 ...
pmerofc 发表于 2011-10-26 10:00



   如何伪装的?

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
50 [报告]
发表于 2011-10-26 13:32 |只看该作者
回复  rover12421

这种设计需要:
1. 获得需要加密的全部明文存放在 iBuf 中
2. 调用函数, 一次性全 ...
OwnWaterloo 发表于 2011-10-26 13:11


没研究过RC4这些加密算法,平常都是找现成代码/库直接用。

C程序可以直接被CPU执行吗?是否可以翻译成汇编?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP