【问题标题】:RSA algorithm in the SSLSSL 中的 RSA 算法
【发布时间】:2012-06-01 14:13:02
【问题描述】:

想了解RSA的解释,这里是例子

Select primes: p=17 & q=11
Compute n = pq =17×11=187
Compute ø(n)=(p–1)(q-1)=16×10=160
Select e : gcd(e,160)=1; choose e=7
Determine d: de=1 mod 160 and d < 160 Value is d=23 since 23×7=161= 10×160+1
Publish public key KU={7,187}
Keep secret private key KR={23,17,11}

看看上面写的素数,我怎么知道这些素数是从哪里生成的。

【问题讨论】:

    标签: rsa


    【解决方案1】:

    这些素数可以通过 RSA 算法随机生成。在这个例子中它们非常小,但在现实生活中它们会非常非常大。该算法在生成素数时还会采取其他一些预防措施。例如,p 和 q 不应该彼此靠近。

    【讨论】:

    • 在示例中,我们以消息“M”为例,M=55 是将消息转换为整数,如果是,计算机如何将数字转换为整数,而不是计算机将所有内容转换为 ANSI 代码。
    • 你的意思是说例子M=55是我们消息的unicode转换
    • @Rain,没有。这只是一个虚构的例子。然而,在现实生活中,它可能会使用某种 Unicode 编码进行编码。
    • 所以,我想知道我们的消息如何转换为整数,因为整数不能被 ASCII 码或任何十六进制数、八进制数分割。
    • 为什么不呢? “Hi”可能会变成 H=74,i=105,所以“Hi”=074105。当然,该数字可以进行 RSA 要求的任何算术运算。这是使用 ASCII 作为编码的示例:asciitable.com
    【解决方案2】:

    这是实现 RSA 的代码

    try out this code
    
    /*Arpana*/
    
    #include<stdio.h> 
    #include<conio.h> 
    #include<stdlib.h> 
    #include<math.h> 
    #include<string.h> 
    
    long int p,q,n,t,flag,e[100],d[100],temp[100],j,m[100],en[100],i; 
    char msg[100]; 
    int prime(long int); 
    void ce(); 
    long int cd(long int); 
    void encrypt(); 
    void decrypt(); 
    void main() 
    { 
    clrscr(); 
    printf("\nENTER FIRST PRIME NUMBER\n"); 
    scanf("%d",&p); 
    flag=prime(p); 
    if(flag==0) 
    { 
        printf("\nWRONG INPUT\n"); 
        getch(); 
        exit(1); 
    } 
    printf("\nENTER ANOTHER PRIME NUMBER\n"); 
    scanf("%d",&q); 
    flag=prime(q); 
    if(flag==0||p==q) 
    { 
        printf("\nWRONG INPUT\n"); 
        getch(); 
        exit(1); 
    } 
    printf("\nENTER MESSAGE\n"); 
    fflush(stdin); 
    scanf("%s",msg); 
    for(i=0;msg[i]!=NULL;i++) 
    m[i]=msg[i]; 
    n=p*q; 
    t=(p-1)*(q-1); 
    ce(); 
    printf("\nPOSSIBLE VALUES OF e AND d ARE\n"); 
    for(i=0;i<j-1;i++) 
    printf("\n%ld\t%ld",e[i],d[i]); 
    encrypt(); 
    decrypt(); 
    getch(); 
    } 
    int prime(long int pr) 
    { 
    int i; 
    j=sqrt(pr); 
    for(i=2;i<=j;i++) 
    { 
        if(pr%i==0) 
        return 0; 
    } 
    return 1; 
    } 
    void ce() 
    { 
    int k; 
    k=0; 
    for(i=2;i<t;i++) 
    { 
        if(t%i==0) 
        continue; 
        flag=prime(i); 
        if(flag==1&&i!=p&&i!=q) 
        { 
            e[k]=i; 
            flag=cd(e[k]); 
            if(flag>0) 
            { 
                d[k]=flag; 
                k++; 
            } 
            if(k==99) 
            break; 
        } 
    } 
    } 
    long int cd(long int x) 
    { 
    long int k=1; 
    while(1) 
    { 
        k=k+t; 
        if(k%x==0) 
        return(k/x); 
    } 
    } 
    void encrypt() 
    { 
    long int pt,ct,key=e[0],k,len; 
    i=0; 
    len=strlen(msg); 
    while(i!=len) 
    { 
        pt=m[i]; 
        pt=pt-96; 
        k=1; 
        for(j=0;j<key;j++) 
        { 
            k=k*pt; 
            k=k%n; 
        } 
        temp[i]=k; 
        ct=k+96; 
        en[i]=ct; 
        i++; 
    } 
    en[i]=-1; 
    printf("\nTHE ENCRYPTED MESSAGE IS\n"); 
    for(i=0;en[i]!=-1;i++) 
    printf("%c",en[i]); 
    } 
    void decrypt() 
    { 
    long int pt,ct,key=d[0],k; 
    i=0; 
    while(en[i]!=-1) 
    { 
        ct=temp[i]; 
        k=1; 
        for(j=0;j<key;j++) 
        { 
            k=k*ct; 
            k=k%n; 
        } 
        pt=k+96; 
        m[i]=pt; 
        i++; 
    } 
    m[i]=-1; 
    printf("\nTHE DECRYPTED MESSAGE IS\n"); 
    for(i=0;m[i]!=-1;i++) 
    printf("%c",m[i]); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-25
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 2011-02-12
      相关资源
      最近更新 更多