找回密码
 欢迎注册
楼主: mathe

[原创] 关于破解维吉尼亚密码的问题

[复制链接]
 楼主| 发表于 2008-3-7 14:44:39 | 显示全部楼层
统计结果表示那个数据有问题,自然无法解开。 我认为要么那个数据有误,要么就是加密算法有问题,或者数据不是来源于英文。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-7 17:53:46 | 显示全部楼层
我想问一下 这个 $chi^2$ 叫什么,怎么念,英文应该叫什么??? BTW, 我想问一下,相减后,如果不除以Pn会怎么样呢?好像也可以呀? 就是直接 fabs (standard_freq - cipher_freq)会如何?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-7 19:23:21 | 显示全部楼层
$chi^2$是希腊字母,应该就按这个希腊字母发音,所以就叫Chi Square。 不除以$p_n4$是也可以看成一个准则,但是不同部分权重不同,没有除以$p_n$后的好,而且最重要的是$chi^2$是一个很重要的分布,所以结果很好处理
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-8 10:04:14 | 显示全部楼层
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-4-15 18:44:55 | 显示全部楼层
购买了竟然不能阅读!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-4-15 19:06:14 | 显示全部楼层
要是有java版的就好了。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-5-10 17:41:32 | 显示全部楼层
金币是够的,怎么TM不能下载,草!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-5-14 16:57:53 | 显示全部楼层
看不到代码,看不到代码。。。。。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-5-14 17:10:07 | 显示全部楼层
靠,我购买了附件怎么不能下载呢
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2021-5-2 19:21:17 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <math.h>

  5. const char *raw = "BZWIEZSEHPVCIEBSYHAWWYLIIGWHMILZLMHTCSXWWCWXWWJLEIWOLMBSWPXWWXSVTZPWEXVESXWWXPMHLPRXDLSMWSJPEQXZLHATOPVIQAYHMCYDLIPNPWSUUZVRDMEMRIZPJMTDOALTFDYHSWYPCBQDLIPXCSWTSYHWIGZHYEJTKLIOSMPTQZYVHZPEZTKREXWWCIHGGFRHBAYIECVMSATVOSACLZMXWADFVDLSIVHKLMHIGSMQSGJSYXFEIRSLZVIXYYSZTJFWAXDWCSJSNXYPDWCVJDPYWPFOXLTQSEXTVSMQPDWXLTEZVIQWNEYHWZJLXKOVIPELRHLZLXLTZLHWPAO";

  6. #define KEY_LEN 12
  7. #define NUMC 26
  8. char freq[KEY_LEN][NUMC];
  9. int count[KEY_LEN];
  10. double prob[NUMC]={0.0788,0.0156,0.0268,0.0389,0.1268,0.0256,0.0187,0.0573,0.0707,0.0010,0.0060,0.0394,0.0244,0.0706,0.0776,0.0186,0.0009,0.0594,0.0634,0.0978,0.0280,0.0102,0.0214,0.0016,0.0202,0.0006};
  11. int main()
  12. {
  13.     int len=strlen(raw);
  14.     int key_len = 5;
  15.     int i,j,k;
  16.     double entropy=0.0;
  17.     double var=0.0;
  18.     for(i=0;i<NUMC;i++){
  19.             entropy-=prob[i]*log(prob[i]);
  20.             var+=prob[i]*log(prob[i])*log(prob[i]);
  21.     }
  22.     for(i=0;i<len;i++){
  23.             char c=raw[i];
  24.             if('a'<=c&&c<='z'){
  25.                     freq[i%KEY_LEN][c-'a']++;
  26.             }else if('A'<=c&&c<='Z'){
  27.                     freq[i%KEY_LEN][c-'A']++;
  28.             }else{
  29.                     fprintf(stderr, "Invalid char %c encounted\n",c);
  30.             }
  31.             count[i%KEY_LEN]++;
  32.     }
  33.     for(i=0;i<KEY_LEN;i++){
  34.             double best_entropy = 0;
  35.             int best_j=-1;
  36.             for(j=0;j<NUMC;j++){
  37.                     double real_entropy=0.0;
  38.                     for(k=0;k<NUMC;k++){
  39.                             real_entropy-=freq[i][(j+k)%NUMC]*log(prob[k]);
  40.                     }
  41.                     if(best_j<0||real_entropy<best_entropy){
  42.                             best_j=j;
  43.                             best_entropy=real_entropy;
  44.                     }
  45.             }
  46.             double exp_entropy = count[i]*entropy;
  47.             double exp_var = count[i]*var;
  48.             exp_var = sqrt(exp_var-exp_entropy*exp_entropy/count[i]);
  49.             if(best_entropy>exp_entropy+4*exp_var){
  50.                     fprintf(stderr, "\nNo valid solution found\n");
  51.                     exit(-1);
  52.             }else{
  53.                     printf("%c",'A'+best_j);
  54.             }
  55.     }
  56.     printf("\n");
  57.     return 0;
  58. }
复制代码

评分

参与人数 1威望 +12 金币 +12 贡献 +12 经验 +12 鲜花 +12 收起 理由
wayne + 12 + 12 + 12 + 12 + 12

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-23 17:36 , Processed in 0.023450 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表