个人头像照片 祁同伟

个人介绍

胜天半子

  • 最新动态
  • 文章
  • 问答
正在加载, 请稍后...
暂无更多信息
正在加载, 请稍后...
暂无更多信息
  • 回答了问题 2019-07-17

    KMP是什么意思

    kmp算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是根据给定的模式串W1,m,定义一个next函数。next函数包含了模式串本身局部匹配的信息。 完全掌握KMP算法思想   学过数据结构的人,都对KMP算法印象颇深。尤其是新手,更是难以理解其涵义,搞得一头雾水。今天我们就来面对它,不将它彻底搞懂,誓不罢休。   如今,大伙基本上都用严蔚敏老师的书,那我就以此来讲解KMP算法。   严老的《数据结构》79-84页讲了基本的匹配方法,这是基础。先把这个搞懂了。   80页在讲KMP算法的开始先举了个例子,让我们对KMP的基本思想有了最初的认识。目的在于指出“由此,在整个匹配的过程中,i指针没有回溯,”。   在此也推荐张铭、赵海燕、王腾蛟编著的《数据结构与算法》一书(北京大学出版社),里面的“字符串”一章对KMP算法有较为详尽易懂的介绍。
    踩0 评论0
  • 回答了问题 2019-07-17

    RSA 加密算法 提到的 1024 2048bit 是什么意思

    bit中文名称是位,音译“比特”,是用以描述电脑数据量的最小单位。
    二进制数系统中,每个0或1就是一个位(bit)。
    单位换算
    1Byte=8bit
    1KB=1024Byte(字节)=8*1024bit
    1MB=1024KB
    1GB=1024MB
    1TB=1024GB
    二进制数系统中,每个0或1就是一个位(bit),位是数据存储的最小单位。其中8bit就称为一个字节(Byte)。计算机中的CPU位数指的是CPU一次能处理的最大位数。例如32位计算机的CPU一次最多能处理32位数据。
    踩0 评论0
  • 回答了问题 2019-07-17

    c语言,求教用快速排序法,将十个数按大小顺序输出。

    给你个程序吧,按照从小到大排列的,答题不易,望采纳。不明白,请追问。 #include "stdio.h"
    #include "stdlib.h"
    #include "math.h"
    main()
    {
    int a[12];
    int i,j,t;
    printf("请输入10个数:\n");
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
    printf("排序前的数列为:\n");
    for(i=0;i<10;i++)
    printf("%4d",a[i]);
    printf("%\n");

    //排序
    for(i=0;i<10;i++)
    for(j=0;j<9-i;j++)
    if(a[j]>a[j+1]) 
    {
    t=a[j];
    a[j]=a[j+1];
    a[j+1]=t;
    }
    //结束排序

    printf("排序后的数列为:\n");
    for(i=0;i<10;i++)
    printf("%4d",a[i]);
    printf("%\n");
    }

    踩0 评论0
  • 回答了问题 2019-07-17

    C语言排序算法一共多少种

    选择排序
    #include <iostream>
    using namespace std;
    void select_sort(int arr[], int num);
    void output_array(int arr[], int num);
    int main()
    {
        int a[10];
        for(int i=0; i<10; i++)
        {
            cin>>a[i];
        }
        select_sort(a,10);
        output_array(a,10);
        return 0;
    }
    void select_sort(int array[],int n) //形参array是数组名
    {
        int i,j,k,t;
        for(i=0; i<n-1; i++)
        {
            k=i;  //先设第i个就为最小
            for(j=i+1; j<n; j++)
                if(array[j]<array[k])
                    k=j;   //通过循环,得到k为最小
            t=array[k];    //交换a[i]和a[k]
            array[k]=array[i];
            array[i]=t;
        }
        return;
    }
    void output_array(int arr[], int num)
    {
        int i;
        for(i=0; i<num; i++)
        {
            cout<<arr[i];
            cout<<endl;
        }
        return;
    }

    2.冒泡排序
    #include<stdio.h>
    int main()
    {
    int i,j,a[10],t;
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
    for(i=0;i<10;i++)
    for(j=i+1;j<10;j++)
    if(a[i]>a[j])
    {
    t=a[j];
    a[j]=a[i];
    a[i]=t;
    }
    for(i=0;i<10;i++)
    printf("%d ",a[i]);
    return 0;
    }

    3.堆排序 #include<iostream>
    using namespace std;
    void  paidui(int a[20],int i,int m)
    {
    int k,t;    
    t=a[i]; 
    k=2*i+1;    
    while (k<m)    
    {        
    if ((k<m-1)&&(a[k]<a[k+1])) 
    k++;   
    if (t<a[k]) 
    {
    a[i]=a[k]; 
    i=k; 
    k=2*i+1;
    }        
    else break; 
    }    
    a[i]=t;
    }
    void duipai(int a[20], int n)  
    {
    int i,k; 
    for (i=n/2-1;i>=0;i--) 
    paidui(a,i,n);     
    for (i=n-1; i>=1; i--)    
    {  
    k=a[0]; 
    a[0]=a[i]; 
    a[i]=k;  
    paidui(a,0,i);    
    }}
    int main() 
    {  
    int a[10],i; 
    for(i=0;i<10;i++)  
    cin>>a[i];
    duipai(a,10); 
    for(i=0;i<10;i++)
    cout<<a[i]<<endl;
    }

    4.快速排序
    #include<iostream>
    using namespace std;
    void Quicksort(int a[],int low,int high)
    {
        if(low>=high)
        {
            return;
        }
        int first=low;
        int last=high;
        int key=a[first];
        while(first<last)
        {
    while(first<last&&a[last]>=key)
                --last;
            a[first]=a[last];
            while(first<last&&a[first]<=key)
                ++first;
            a[last]=a[first];
    }
        a[first]=key;
        Quicksort(a,low,first-1);
        Quicksort(a,last+1,high);
    }


    int main()
    {
        int i,a[100],x,n=0;
    while(cin>>x)
    {
    a[n]=x;
    n++;
    }
    n--;
    Quicksort(a,0,n);
    for(i=0;i<=n;i++)
    cout<<a[i]<<" ";
    cout<<endl;
        return 0;
    }

    5. 基数排序 #include <stdio.h>
    #include <stdlib.h>
    int main(){
    int data[10]={73,22,93,43,55,14,82,65,39,81};        //对十个数进行排序
    int temp[10][10]={0};        //构造一个临时二维数组,其值为0
    int order[10]={0};        //构造一维数组,其值为0
    int i,j,k,n,lsd;
    k=0;n=1;
    for (i=0;i<10;i++) printf("%d ",data[i]);         //在排序前,对这10个数打印一遍
    putchar('\n');
    while (n<=10){
    for (i=0;i<10;i++){
    lsd=((data[i]/n)%10);         //lsd先对个位取余,然后再对十位取余,注意循环
    temp[lsd][order[lsd]]=data[i];        //temp[3][0]=73,temp[2][0]=22,temp[3][1]=93,temp[3][2]=43,⋯⋯
    order[lsd]++;        //需要区分的是lsd和order[lsd],这两个不是一样的概念嗷
    }
    printf("\n重新排列: ");
    for (i=0;i<10;i++){
    if(order[i]!=0)
    for (j=0;j<order[i];j++){


    data[k]=temp[i][j];
    printf("%d ",data[k]);
    k++;
    }
    order[i]=0;
    }
    n*=10; //第二次用十位
    k=0;
    }
    putchar('\n');
    printf("\n排序后: ");
    for (i=0;i<10;i++) printf("%d ",data[i]);
    return 0;
    }

    6.希尔排序
    #include<iostream>
    using namespace std;
    void shell_sort(int a[],int n);
    int main()
    {
        int n,a[10000];
        cin>>n;
        for(int y=0;y<n;y++)
            cin>>a[y];
        shell_sort(a, n);
          for(int i=0; i<n; i++)
              cout<<a[i]<<" ";
          cout<<endl;
    }

    void shell_sort(int a[], int n)
    {
        int gap,k,temp;//定义增量;
        for(gap = 3; gap >0; gap--)//设置初始增量,递减;
        {
            for(int i=0; i<gap; i++)//按增量分组;
            {
                for(int j = i+gap; j<n; j=j+gap)//每组分别比较大小;
                {
                    if(a[j]<a[j-gap])
                    {
                        temp = a[j];
                        k = j-gap;
    while(k>=0&&a[k]>temp)
                        {
                            a[k+gap] = a[k];
                            k = k-gap;
                        } 

                       a[k+gap] = temp;
                    }
                }
            }
        }
    }

    7.归并排序
    #include<iostream>
    using namespace std;
    void MergeSort(int p[],int s,int m,int t)
    {
         int q[100];                        //q[100]用来存放排好的序列
     int i=s;
     int j=m+1;
     int k=s;
    while(i<=m&&j<=t)
     {
     if(p[i]<=p[j])
     q[k++]=p[i++];
     else
     q[k++]=p[j++];
     }
     if(i<=m)
     while(i<=m)
     q[k++]=p[i++];
     else while(j<=t)
     q[k++]=p[j++];
     for(int n=s;n<=t;n++)
                 p[n]=q[n];
    }
     void Merge(int p[],int s,int t)
     {
     if(s<t)
     {
     int m=(s+t)/2;  //将数组分成两半
     Merge(p,s,m);//递归拆分左数组
     Merge(p,m+1,t);//递归拆分右数组
     MergeSort(p,s,m,t);//合并数组
         }
     }
     int main()
     {
         int n;
     int p[100];
     cin>>n;
      for(int i=0; i<n; i++)
             cin>>p[i];
     Merge(p,0,n-1);
     for(int j=0;j<n;j++)
     cout<<p[j]<<" ";
     cout<<endl;
     return 0;
     }

    排序方法基本就这些,还有双向冒泡这种拓展的排序方法,还有直接排序如桶排序

    踩0 评论0
  • 回答了问题 2019-07-17

    1!+2!+。。。+20!用递归算法怎么写啊

    用C语言写的
    # include<stdio.h>
    int fac(int n)
    {
    long y;
    if (n == 0 || n == 1)
    y = 1;
    else
    y = n*fac(n-1);
    return y;
    }
    main()
    {
    int i = 1, n;
    long sum = 0;
    printf("input n:\n");
    scanf("%d", &n);
    for (; i <= n; i++)
    sum = sum+fac(i);
    printf("%ld\n", sum);
    }
    踩0 评论0
  • 回答了问题 2019-07-17

    写一个冒泡法排序函数sort,并在主函数中调用sort函数对10个整数排序

    假设有数组A[10]={1,2,3,4,5,6,7,8,9,0}
    void sort()
    {
    int t;
    for(i=0;i<9;i++)
    for(j=0;j<9-i;j++)

    if(A[j]>A[j+1])

    {
    t=A[j];

    A[j]=A[i+1];

    A[i+1]=t;
    }
    }
    踩0 评论0
  • 回答了问题 2019-07-17

    递归算法可以函数里出现多个分支吗?

    可以
    踩0 评论0
  • 回答了问题 2019-07-17

    7. rsa算法中,已知en为5,25 ,截获的密文为10,问明文是多少?

    p=5 q=5
    l=16
    5d mod 16=1
    d=13
    明文=10^13 mod 25
    算算吧
    踩0 评论0
  • 回答了问题 2019-07-17

    十进制数54转换成二进制整数是0110110。我算后是110110,不明白前面为什么要加0,求解答

    上面第一个人把错的看成正确的了
    踩0 评论0
  • 回答了问题 2019-07-17

    计算机算法与设计中什么是平衡子问题

    如果想了解算法的话可以看一看《算法导论》,这里有许多经典的算法,从简单到复杂都有,也包括楼上说的NP问题。
    踩0 评论0
  • 回答了问题 2019-07-17

    编程里面的“二进制”怎么计算的?

    只有1和0
    踩0 评论0
  • 回答了问题 2019-07-17

    写出求解1+2+3+.........+n的迭代算法和递归算法

    啥意思
    踩0 评论0
  • 回答了问题 2019-07-17

    递归论的算法演化

    解决某一类问题的计算方法又称算法。算法是个古老的数学概念。16世纪R.笛卡尔创造的解析几何就是用代数来解决几何问题的一种典型的算法。但数学中有一些问题长期找不到解决的算法。人们怀疑根本不存在这种算法。为了证明这一点,必须对算法给出精确的定义。20世纪30年代K.哥德尔提出了算法的一种精确定义,S.C.克林据此定义了递归函数。与此同时,A.M.图灵用图灵机(一种理论计算机)来描述算法,并且证明图灵可计算的函数与递归函数等价。图灵机使人们普遍接受了关于算法的丘奇论题:递归函数是可计算函数的精确的数学描述。
    递归函数是用数理逻辑的方法定义在自然数集上的可计算函数。如果自然数的一个 n 元集的特征函数是递归函数,就称这个集合为递归集,一个递归函数的值域,称为递归可枚举集。递归集就是算法可判定的集合。递归集都是递归可枚举的,但是存在不是递归集的递归可枚举的集合。递归论的研究使人们把一些长期未解决的问题化为非递归的递归可枚举集,从而严格证明了不存在判定这些问题的算法。这些问题称为不可判定的。
    递归论进一步研究不可判定的,也就是非递归的递归可枚举集之间的复杂程度问题。1944年E.L.波斯特提出不可解度的概念。又给出了相对可计算性的构造方法。这就使人们开始对不可解度进行比较,并研究不可解度的代数结构。这方面出现了有穷损害优先方法、无穷损害优先方法等多种有力的研究手段,出现了许多有趣的研究成果。
    对可计算的递归集,也可以研究其计算的复杂性,考虑图灵机上计算的时间,空间,就得到计算时间的长短计算所占空间的多少这两个复杂性。计算复杂性的研究对计算机科学的发展有很大影响和作用。

    踩0 评论0
  • 回答了问题 2019-07-17

    编程之美的作品评价

    (1)的确是好书,不同于算法导论和程序设计艺术之类的书(比较抽象),结合很多比较现实易于形象化的题目,大开眼界。每天做两道题目,感觉挺有收获的。
    ——互动网读者superzxt
    (2)这本书对于学生求职还是很有帮助的,通过做题可以先感受一下笔试面试气氛,拓宽自己的解题思路,从而有助于找到一份不错的工作。强烈推荐大家对每一道题目都好好揣摩揣摩,必能受益良多。
    ——互动网读者cx_flying
    (3)这本书表面上是讲解算法,实际上体现了一种面对困难、解决问题的心态……个人还是挺喜欢这类书的,把编程人性化了……
    ——互动网读者拓荒者
    (4)……这本书更大的作用在于——给你一个有趣的题目,让你自己去思考,思考出来后再对照它给出的解法,看看你是否做对了。在这个过程中,你学会了作为一个程序员最重要的东西——独立思考的能力,而不是碰到问题就在网上到处找代码片段,盲目拷贝已有的解决方案。
    ——互动网读者CoolJie2001
    (5)买这本书是因为看到这本书名字的前四个字,而非后面几个字。看着书的封面,朴素简单的设计,处处透出清新之美。
    随着软件产业的迅速发展,各种高级编程语言铺天盖地席卷而来,软件开发变得单调而枯燥,而编程本身的乐趣如今却很难在身边找到。这本书正是迎合了我的想法,编程本身应该非常有乐趣,通过巧妙的思考,寻求解决问题的方法。《编程之美》放在案前,每有倦意,品杯香茶,翻开几页,感受久违的古色古香,沉浸在美妙的思考中,别有一翻滋味~~
    ——当当网读者nuaapjy
    (6)之前对算法的印象是晦涩难懂,每每总是望而却步,提不起来兴趣去研究算法,读了《编程之美》中的几个算法,有一种豁然开朗的感觉,原来算法也可以讲的这么生动有趣,这么吸引人。《编程之美》中的算法以实例开题,循序渐进的解决问题,一步步去剖析算法的本质,挖掘和发散算法功效,进而去淋漓尽致的体现算法的美妙。
    ——当当网读者萝卜萝卜闪金光
    (7)一本编程的课外读物,引发编程兴趣的好书。
    ——当当网读者tiangu0120
    (8)此书重要的是开拓思路,有一定基础的朋友看了这个,就会有一种意犹未尽的感觉,“原来还可以这么玩啊”的想法。
    ——卓越网读者yc_andy1009
    (9)刚刚读完这本书,感觉不错,启发很大,这是我继读完《算法导论》以来发现比较好的一本书,推荐对算法以及对大公司的面试题有兴趣的人去看看。
    ——卓越网读者lironghua
    (10)算法是计算机程序设计的灵魂,是每个计算机专业的学生和从业人员必须具备的基本素质之一。微软把一些看似简单,实则蕴含深刻内涵的算法题目作为面试的重要内容,是经过深思熟虑了的。
    ——网友Sswv
    (11)《编程之美》中这些谜题考察、锻炼的是扎实、严密和具有创造性的思考能力,面对问题有条不紊的分析能力,和不断深入、刨根问底的精神。毫无疑问,这些素质,都是软件工程师身上最宝贵的东西。
    ——《程序员》杂志技术主编孟岩
    (12)随着软件产业的迅速发展,各种高级编程语言铺天盖地席卷而来,软件开发变得单调而枯燥,而编程本身的乐趣如今却很难在身边找到。《编程之美》正是迎合了我的想法,编程本身应该非常有乐趣,通过巧妙的思考,寻求解决问题的方法。
    ——当当网读者nuaapjy
    (13)我招人的时候找了《编程之美》上面的题目作参考,效果还不错。里面描述的算法很有意思。
    ——当当网读者beikerray119
    (14)工程师的骄傲,在于创造。编程的乐趣也在于探索。当我们不仅爱玩电脑,会玩电脑,也尝试着用电脑去解决实际的问题并获得成功的时候,那种自我肯定的快乐是一般途径所体会不到的。
    何为编程之美。巧妙的思路,简明的算法,严谨的数学分析——这些综合起来就是编程之美。
    ——网友Ultra

    踩0 评论0
  • 回答了问题 2019-07-17

    有谁知道通过wifi连接时,谷歌地图也能定位,这是什么原理呢?

    卫星定位
    踩0 评论0
  • 回答了问题 2019-07-17

    C语言谁能告诉我 数据结构和算法里 快速排序 是怎么弄的?定义两个指针,和一个关键字 具体怎么弄?

    快速排序是基于分治思想的排序算法。
    一般的快排是把大于第一个数的放到右边,小于第一个数的放到左边,然后再对分成的两部分递归。
    很简单的一个算法。
    现在这里没有编译器,代码不好敲。如果你理解能力或动手能力比较差非常需要代码的话,就追问吧~~
    踩0 评论0
  • 回答了问题 2019-07-17

    matlab中冒泡排序法,要求对输入的数组元素进行排序

    先建一个函数脚本:bubble.m function [ x ] = bubble( x )

    if ~isvector(x)
        error('bubble: `x` must be a vector.')
    end

    n = length(x);
    for j = 1:n
        for i = 1:n-j
            if x(i) > x(i+1)
                t = x(i);
                x(i) = x(i+1);
                x(i+1) = t;
            end
        end
    end

    end

    然后就可以调用了,比如: x = randperm(10)
    x = bubble(x)

    踩0 评论0
  • 回答了问题 2019-07-17

    本人只学过一点c++的面向过程部分,能够通过《算法》第四版学习数据结构与算法吗?

    会比较困难,建议对指针与过程深入了解
    踩0 评论0
  • 回答了问题 2019-07-17

    33MD为什么打不开了

    1.如果是一般的话只有32&162.本来在理论上不可破解,但好像被人破解了,你可以看下参考 目前网上的dm5破解都是通过建立数据库进行查询的方法进行破解的 好像还没有直接破解的工具,网上的都属于类似穷举的方法MD5简介MD5的全称是Message-digest Algorithm 5(信息-摘要算法),用于确保信息传输完整一致。在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc,的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个算法的描述和c语言源代码在Internet RFC 1321中有详细的描述( ,这是一份最权威的文档,由Ronald L. Rivest在1992年8月向IETF提交。 Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验和将产生MD2冲突。MD2算法的加密后结果是唯一的--即没有重复。 为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。 尽管MD4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。 一年以后,即1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4稍微慢一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD5完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。 Van oorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force hash function),而且他们猜测一个被设计专门用来搜索MD5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代MD5算法的MD6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响MD5的安全性。上面所有这些都不足以成为MD5的在实际应用中的问题。并且,由于MD5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。 2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。 令世界顶尖密码学家想象不到的是,破解MD5之后,2005年2月,王小云教授又破解了另一国际密码SHA-1。因为SHA-1在美国等国际社会有更加广泛的应用,密码被破的消息一出,在国际社会的反响可谓石破天惊。换句话说,王小云的研究成果表明了从理论上讲电子签名可以伪造,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。MD5破解工程权威网站 是为了公开征集专门针对MD5的攻击而设立的,网站于2004年8月17日宣布:“中国研究人员发现了完整MD5算法的碰撞;Wang, Feng, Lai与Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128几个 Hash函数的碰撞。这是近年来密码学领域最具实质性的研究进展。使用他们的技术,在数个小时内就可以找到MD5碰撞。……由于这个里程碑式的发现,MD5CRK项目将在随后48小时内结束”。 MD5用的是哈希函数,在计算机网络中应用较多的不可逆加密算法有RSA公司发明的MD5算法和由美国国家技术标准研究所建议的安全散列算法SHA.[编辑本段]算法的应用 MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如: MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461 这就是tanajiya.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。为了让读者朋友对MD5的应用有个直观的认识,笔者以一个比方和一个实例来简要描述一下其工作过程: 大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为公安机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。 我们常常在某些软件下载站点的某软件信息中看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件(如Windows MD5 Check等)做一次MD5校验,以确保我们获得的文件与该站点提供的文件为同一文件。利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面。 MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。 所以,要遇到了md5密码的问题,比较好的办法是:你可以用这个系统中的md5()函数重新设一个密码,如admin,把生成的一串密码覆盖原来的就行了。 MD5还广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方。如在UNIX系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。MD5将任意长度的“字节串”映射为一个128bit的大整数,并且是通过该128bit反推原始字符串是困难的,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。所以,要遇到了md5密码的问题,比较好的办法是:你可以用这个系统中的md5()函数重新设一个密码,如admin,把生成的一串密码的Hash值覆盖原来的Hash值就行了。 正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为"跑字典"的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 Bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。这种加密技术被广泛的应用于UNIX系统中,这也是为什么UNIX系统比一般操作系统更为坚固一个重要原因。
    踩0 评论0
  • 回答了问题 2019-07-17

    已知某进制数运算2X3=10,则3X5=?

    2×3=10 所以满6进1 为6进制3×5=15=2×6+3 所以3×5=23
    踩0 评论0
正在加载, 请稍后...
滑动查看更多