RSA与大数运算

RSA算法实现中的大数运算,看别人写的  // BigInt.cpp: implementation of the BigInt class./////////////////////////////////////////////////////////////////////////*****************************************************************大数运算库源文件:Bi 阅读详情
标 题:《RSA与大数运算》 
发信人:afanty
时 间:2003/04/28 04:50pm
详细信息:

    基于以下原因,俺估计RSA算法会被越来越多的共享软件采用:

    1、原理简洁易懂
    2、加密强度高
    3、专利限制已过期
    4、看雪老大三番五次呼吁共享软件采用成熟的非对称加密技术

    所以,大家应该对RSA算法进行深入了解。

    RSA依赖大数运算,目前主流RSA算法都建立在512位到1024位的
    大数运算之上,所以我们在现阶段首先需要掌握1024位的大数
    运算原理。

    大多数的编译器只能支持到64位的整数运算,即我们在运算中
    所使用的整数必须小于等于64位,即:0xffffffffffffffff
    也就是18446744073709551615,这远远达不到RSA的需要,于是
    需要专门建立大数运算库来解决这一问题。

    最简单的办法是将大数当作字符串进行处理,也就是将大数用
    10进制字符数组进行表示,然后模拟人们手工进行“竖式计算”
    的过程编写其加减乘除函数。但是这样做效率很低,因为1024
    位的大数其10进制数字个数就有数百个,对于任何一种运算,
    都需要在两个有数百个元素的数组空间上做多重循环,还需要
    许多额外的空间存放计算的进位退位标志及中间结果。当然其
    优点是算法符合人们的日常习惯,易于理解。

    另一种思路是将大数当作一个二进制流进行处理,使用各种移
    位和逻辑操作来进行加减乘除运算,但是这样做代码设计非常
    复杂,可读性很低,难以理解也难以调试。

    于是俺琢磨了一种介于两者之间的思路:

    将大数看作一个n进制数组,对于目前的32位系统而言n可以取
    值为2的32次方,即0x100000000,假如将一个1024位的大数转
    化成0x10000000进制,它就变成了32位,而每一位的取值范围
    就不是0-1或0-9,而是0-0xffffffff。我们正好可以用一个无
    符号长整数来表示这一数值。所以1024位的大数就是一个有32
    个元素的unsigned long数组。而且0x100000000进制的数组排列
    与2进制流对于计算机来说,实际上是一回事,但是我们完全
    可以针对unsigned long数组进行“竖式计算”,而循环规模
    被降低到了32次之内,并且算法很容易理解。

    例如大数18446744073709551615,等于“ffffffff ffffffff”,
    它就相当于10进制的“99”:有两位,每位都是ffffffff。
    而大数18446744073709551616,等于“00000001 00000000
    00000000”,它就相当于10进制的“100”:有三位,第一位是
    1,其它两位是0。如果我们要计算18446744073709551616
    -18446744073709551615,就类似于100-99:
    
      00000001 00000000 00000000
    -           ffffffff ffffffff
    -----------------------------
    =        0         0        1


    所以,可以声明大数类如下:
    /****************************************************************/
    //大数运算库头文件:BigInt.h
    //作者:afanty@vip.sina.com
    //版本:1.0 (2003.4.26)
    //说明:适用于MFC
    /****************************************************************/

    #define BI_MAXLEN 40
    #define DEC 10
    #define HEX 16

    class CBigInt
    {
    public:
       int m_nSign;    //记录大数的符号,支持负值运算
       int m_nLength;  //记录0x10000000进制的位数,0-40之间,相当于2进制的0-1280位
       unsigned long m_ulvalue[BI_MAXLEN];   //记录每一位的“数字”

       CBigInt();
       ~CBigInt();


    //将大数赋值为另一个大数   
       CBigInt& Mov(CBigInt& A);

    //将大数赋值为编译器能够理解的任何整形常数或变量 
       CBigInt& Mov(unsigned __int64 A);

    //比较两个大数大小
       int Cmp(CBigInt& A);

    //计算两个大数的和
       CBigInt Add(CBigInt& A);

    //重载函数以支持大数与普通整数相加
       CBigInt Add(long A);

    //计算两个大数的差
       CBigInt Sub(CBigInt& A);

    //重载函数以支持大数与普通整数相减
       CBigInt Sub(long A);

    //计算两个大数的积
       CBigInt Mul(CBigInt& A);

    //重载函数以支持大数与普通整数相乘
       CBigInt Mul(long A);

    //计算两个大数的商
       CBigInt Div(CBigInt& A);

    //重载函数以支持大数与普通整数相除
       CBigInt Div(long A);

    //计算两个大数相除的余数
       CBigInt Mod(CBigInt& A);

    //重载函数以支持大数与普通整数相除求模
       long Mod(long A);

    //将输入的10进制或16进制字符串转换成大数
       int InPutFromStr(CString& str, const unsigned int system);

    //将大数按10进制或16进制格式输出到字符串
       int OutPutToStr(CString& str, const unsigned int system);

    //欧几里德算法求:Y=X.Euc(A),使满足:YX mod A = 1
       CBigInt Euc(CBigInt& A);

    //蒙哥马利算法求:Y=X.Mon(A,B),使满足:X^A mod B = Y
       CBigInt Mon(CBigInt& A, CBigInt& B);
    };


    注意以上函数的声明格式,完全遵循普通整数运算的习惯,例如大数
    Y=X+Z 相当于 Y.Mov(X.(Add(Z)),这样似乎没有Mov(Y,Add(X,Z))
    看起来舒服,但是一旦我们重载运算符“=”为“Mov”,“+”为“Add”,
    则Y.Mov(X.(Add(Z))的形式就等价于 Y=X+Z。

    俺不知道其他编程语言里是否支持运算浮重载,至少这样定义函数格式
    在C++里可以带来很大的方便。


    下面让我们来实现大数类的主要成员函数:
    /****************************************************************/
    //大数运算库源文件:BigInt.cpp
    //作者:afanty@vip.sina.com
    //版本:1.0 (2003.4.26)
    //说明:适用于MFC
    /****************************************************************/

    #include "stdafx.h"
    #include "BigInt.h"

    //初始化大数为0
    CBigInt::CBigInt()
    {
    m_nSign=1;
    m_nLength=1;
    for(int i=0;i<BI_MAXLEN;i++)m_ulvalue[i]=0;
    }

    //采用缺省的解构函数
    CBigInt::~CBigInt()
    {
    }

    //大数比较,如果大数A位数比大数B多,当然A>B
    //如果位数相同,则从高位开始比较,直到分出大小
    int CBigInt::Cmp(CBigInt& A)
    {
    if(m_nLength>A.m_nLength)return 1;
    if(m_nLength<A.m_nLength)return -1;
    for(int i=m_nLength-1;i>=0;i--)
    {
    if(m_ulvalue[i]>A.m_ulvalue[i])return 1;
    if(m_ulvalue[i]<A.m_ulvalue[i])return -1;
    }
    return 0;
    }

    //照搬参数的各属性
    CBigInt& CBigInt::Mov(CBigInt& A)
    {
    m_nLength=A.m_nLength;
    for(int i=0;i<BI_MAXLEN;i++)m_ulvalue[i]=A.m_ulvalue[i];
    return *this;
    }

    //大数相加
    //调用形式:N.Add(A),返回值:N+A
    //若两大数符号相同,其值相加,否则改变参数符号再调用大数相减函数
    /******************************************************************/
    例如:
         A  B  C
    +       D  E
    --------------
    = S  F  G  H

    其中,若C+E<=0xffffffff,则H=C+E,carry(进位标志)=0
         若C+E>0xffffffff,则H=C+E-0x100000000,carry=1

         若B+D+carry<=0xfffffff,则G=B+D,carry=0     
         若B+D+carry>0xfffffff,则G=B+D+carry-0x10000000,carry=1

         若carry=0,则F=A,S=0
         若carry=1,A<0xfffffff,则F=A+1,S=0
         若carry=1,A=0xfffffff,则F=0,S=1
    /*****************************************************************/
    CBigInt CBigInt::Add(CBigInt& A)
    {
    CBigInt X;
    if(X.m_nSign==A.m_nSign)
    {
    X.Mov(*this);
    int carry=0;
           unsigned __int64 sum=0;
           if(X.m_nLength<A.m_nLength)X.m_nLength=A.m_nLength;
    for(int i=0;i<X.m_nLength;i++)
    {
    sum=A.m_ulvalue[i];
    sum=sum+X.m_ulvalue[i]+carry;
    X.m_ulvalue[i]=(unsigned long)sum;
    if(sum>0xffffffff)carry=1;
    else carry=0;
    }
    if(X.m_nLength<BI_MAXLEN)
    {
    X.m_ulvalue[X.m_nLength]=carry;
       X.m_nLength+=carry;
    }
    return X;
    }
    else{X.Mov(A);X.m_nSign=1-X.m_nSign;return Sub(X);}
    }

    //大数相减
    //调用形式:N.Sub(A),返回值:N-A
    //若两大数符号相同,其值相减,否则改变参数符号再调用大数相加函数
    /******************************************************************/
    例如:
         A  B  C
    -       D  E
    --------------
    =    F  G  H

    其中,若C>=E,则H=C-E,carry(借位标志)=0
         若C<E,则H=C-E+0x100000000,carry=1

         若B-carry>=D,则G=B-carry-D,carry=0     
         若B-carry<D,则G=B-carry-D+0x10000000,carry=1

         若carry=0,则F=A
         若carry=1,A>1,则F=A-1
         若carry=1,A=1,则F=0
    /*****************************************************************/
    CBigInt CBigInt::Sub(CBigInt& A)
    {
    CBigInt X;
    if(m_nSign==A.m_nSign)
    {
    X.Mov(*this);
    int cmp=X.Cmp(A);
    if(cmp==0){X.Mov(0);return X;}
    int len,carry=0;
    unsigned __int64 num;
    unsigned long *s,*d;
           if(cmp>0)
                   {
                           s=X.m_ulvalue;
                           d=A.m_ulvalue;
                           len=X.m_nLength;
                   }
           if(cmp<0)
                   {
                           s=A.m_ulvalue;
                           d=X.m_ulvalue;
                           len=A.m_nLength;
                           X.m_nSign=1-X.m_nSign;
                   }
           for(int i=0;i<len;i++)
    {
    if((s[i]-carry)>=d[i])
    {
    X.m_ulvalue[i]=s[i]-carry-d[i];
    carry=0;
    }
    else
    {
    num=0x100000000+s[i];
    X.m_ulvalue[i]=(unsigned long)(num-carry-d[i]);
    carry=1;
    }
    }
    while(X.m_ulvalue[len-1]==0)len--;
    X.m_nLength=len;
    return X;
    }
    else{X.Mov(A);X.m_nSign=1-X.m_nSign;return Add(X);}
    }

    //大数相乘
    //调用形式:N.Mul(A),返回值:N*A
    /******************************************************************/
    例如:
            A  B  C
    *          D  E
    ----------------
    =    S  F  G  H
    + T  I  J  K
    ----------------
    = U  V  L  M  N

    其中,SFGH=ABC*E,TIJK=ABC*D

    而对于:
         A  B  C
    *          E
    -------------
    = S  F  G  H   

    其中,若C*E<=0xffffffff,则H=C*E,carry(进位标志)=0
         若C*E>0xffffffff,则H=(C*E)&0xffffffff
           carry=(C*E)/0xffffffff
         若B*E+carry<=0xffffffff,则G=B*E+carry,carry=0
         若B*E+carry>0xffffffff,则G=(B*E+carry)&0xffffffff
           carry=(B*E+carry)/0xffffffff
         若A*E+carry<=0xffffffff,则F=A*E+carry,carry=0
         若A*E+carry>0xffffffff,则F=(A*E+carry)&0xffffffff
           carry=(A*E+carry)/0xffffffff
         S=carry
    /*****************************************************************/
    CBigInt CBigInt::Mul(CBigInt& A)
    {
    CBigInt X,Y;
    unsigned __int64 mul;
           unsigned long carry;
           for(int i=0;i<A.m_nLength;i++)
    {
    Y.m_nLength=m_nLength;
    carry=0;
    for(int j=0;j<m_nLength;j++)
    {
    mul=m_ulvalue[j];
    mul=mul*A.m_ulvalue[i]+carry;
    Y.m_ulvalue[j]=(unsigned long)mul;
    carry=(unsigned long)(mul>>32);
    }
    if(carry&&(Y.m_nLength<BI_MAXLEN))
                   {
                           Y.m_nLength++;
                           Y.m_ulvalue[Y.m_nLength-1]=carry;
                   }
    if(Y.m_nLength<BI_MAXLEN-i)
    {
    Y.m_nLength+=i;
           for(int k=Y.m_nLength-1;k>=i;k--)Y.m_ulvalue[k]=Y.m_ulvalue[k-i];
           for(k=0;k<i;k++)Y.m_ulvalue[k]=0;
    }
    X.Mov(X.Add(Y));
    }
    if(m_nSign+A.m_nSign==1)X.m_nSign=0;
    else X.m_nSign=1;
    return X;
    }

    //大数相除
    //调用形式:N.Div(A),返回值:N/A
    //除法的关键在于“试商”,然后就变成了乘法和减法
    //这里将被除数与除数的试商转化成了被除数最高位与除数最高位的试商
    CBigInt CBigInt::Div(CBigInt& A)
    {
    CBigInt X,Y,Z;
    int len;
    unsigned __int64 num,div;
    unsigned long carry=0;
    Y.Mov(*this);
    while(Y.Cmp(A)>0)
    {     
    if(Y.m_ulvalue[Y.m_nLength-1]>A.m_ulvalue[A.m_nLength-1])
    {
    len=Y.m_nLength-A.m_nLength;
    div=Y.m_ulvalue[Y.m_nLength-1]/(A.m_ulvalue[A.m_nLength-1]+1);
    }
    else if(Y.m_nLength>A.m_nLength)
    {
    len=Y.m_nLength-A.m_nLength-1;
    num=Y.m_ulvalue[Y.m_nLength-1];
    num=(num<<32)+Y.m_ulvalue[Y.m_nLength-2];
    if(A.m_ulvalue[A.m_nLength-1]==0xffffffff)div=(num>>32);
    else div=num/(A.m_ulvalue[A.m_nLength-1]+1);
    }
    else
    {
                           X.Mov(X.Add(1));
    break;
    }
                   Z.Mov(div);
    Z.m_nLength+=len;
    for(int i=Z.m_nLength-1;i>=len;i--)Z.m_ulvalue[i]=Z.m_ulvalue[i-len];
    for(i=0;i<len;i++)Z.m_ulvalue[i]=0;
    X.Mov(X.Add(Z));
    Z.Mov(Z.Mul(A));
    Y.Mov(Y.Sub(Z));
    }
    if(Y.Cmp(A)==0)X.Mov(X.Add(1));
    if(m_nSign+A.m_nSign==1)X.m_nSign=0;
    else X.m_nSign=1;
    return X;
    }

    //大数求模
    //调用形式:N.Mod(A),返回值:N%A
    //求模与求商原理相同
    CBigInt CBigInt::Mod(CBigInt& A)
    {
    CBigInt X,Y;
    int len;
    unsigned __int64 num,div;
    unsigned long carry=0;
    X.Mov(*this);
    while(X.Cmp(A)>0)
    {     
    if(X.m_ulvalue[X.m_nLength-1]>A.m_ulvalue[A.m_nLength-1])
    {
    len=X.m_nLength-A.m_nLength;
    div=X.m_ulvalue[X.m_nLength-1]/(A.m_ulvalue[A.m_nLength-1]+1);
    }
    else if(X.m_nLength>A.m_nLength)
    {
    len=X.m_nLength-A.m_nLength-1;
    num=X.m_ulvalue[X.m_nLength-1];
    num=(num<<32)+X.m_ulvalue[X.m_nLength-2];
    if(A.m_ulvalue[A.m_nLength-1]==0xffffffff)div=(num>>32);
    else div=num/(A.m_ulvalue[A.m_nLength-1]+1);
    }
    else
    {
    X.Mov(X.Sub(A));
    break;
    }
                   Y.Mov(div);
    Y.Mov(Y.Mul(A));
    Y.m_nLength+=len;
    for(int i=Y.m_nLength-1;i>=len;i--)Y.m_ulvalue[i]=Y.m_ulvalue[i-len];
    for(i=0;i<len;i++)Y.m_ulvalue[i]=0;
    X.Mov(X.Sub(Y));
    }
    if(X.Cmp(A)==0)X.Mov(0);
    return X;
    }


    //暂时只给出了十进制字符串的转化
    int CBigInt::InPutFromStr(CString& str, const unsigned int system=DEC)
    {
           int len=str.GetLength();
    Mov(0);
    for(int i=0;i<len;i++)
           {
                 Mov(Mul(system));
    int k=str[i]-48;
    Mov(Add(k));
     }
     return 0;
    }

    //暂时只给出了十进制字符串的转化
    int CBigInt::OutPutToStr(CString& str, const unsigned int system=DEC)
    {
    str="";
    char ch;
    CBigInt X;
    X.Mov(*this);
    while(X.m_ulvalue[X.m_nLength-1]>0)
    {
    ch=X.Mod(system)+48;
    str.Insert(0,ch);
           X.Mov(X.Div(system));
    }
    return 0;
    }

    //欧几里德算法求:Y=X.Euc(A),使满足:YX mod A=1
    //相当于对不定方程ax-by=1求最小整数解
    //实际上就是初中学过的辗转相除法
    /********************************************************************/
    例如:11x-49y=1,求x

               11 x  -  49 y  =   1      a)
    49%11=5 ->  11 x  -   5 y  =   1      b)
    11%5 =1 ->     x  -   5 y  =   1      c)

    令y=1  代入c)式  得x=6
    令x=6  代入b)式  得y=13
    令y=13 代入a)式  得x=58 
    /********************************************************************/
    CBigInt CBigInt::Euc(CBigInt& A)
    {
    CBigInt X,Y;
    X.Mov(*this);
    Y.Mov(A);
    if((X.m_nLength==1)&&(X.m_ulvalue[0]==1))return X;
    if((Y.m_nLength==1)&&(Y.m_ulvalue[0]==1)){X.Mov(X.Sub(1));return X;}
    if(X.Cmp(Y)==1)X.Mov(X.Mod(Y));
    else Y.Mov(Y.Mod(X));
    X.Mov(X.Euc(Y));
           Y.Mov(*this);
    if(Y.Cmp(A)==1)
    {
    X.Mov(X.Mul(Y));
    X.Mov(X.Sub(1));
    X.Mov(X.Div(A));
    }
    else
    {
    X.Mov(X.Mul(A));
    X.Mov(X.Add(1));
    X.Mov(X.Div(Y));
    }
    return X;
    }

    //蒙哥马利算法求:Y=X.Mon(A,B),使满足:X^A mod B=Y
    //俺估计就是高中学过的反复平方法
    CBigInt CBigInt::Mon(CBigInt& A, CBigInt& B)
    {
    CBigInt X,Y,Z;
    X.Mov(1);
    Y.Mov(*this);
           Z.Mov(A);
    while((Z.m_nLength!=1)||Z.m_ulvalue[0])
    {
    if(Z.m_ulvalue[0]&1)
    {
    Z.Mov(Z.Sub(1));
    X.Mov(X.Mul(Y));
    X.Mov(X.Mod(B));
    }
    else
    {
    Z.Mov(Z.Div(2));
    Y.Mov(Y.Mul(Y));
    Y.Mov(Y.Mod(B));
    }
    }
           return X;
    }


    最后需要说明的是因为在VC里面存在一个__int64类型可以
    用来计算进位与借位值,所以将大数当作0x100000000进制
    进行运算是可能的,而在其他编译系统中如果不存在64位
    整形,则可以采用0x40000000进制,由于在0x40000000
    进制中,对任何两个“数字”进行四则运算,结果都在
    0x3fffffff*03fffffff之间,小于0xffffffff,都可以用
    一个32位无符号整数来表示。事实上《楚汉棋缘》采用的
    freelip大数库正是运用了0x40000000进制来表示大数的,
    所以其反汇编后大数的值在内存中表现出来有些“奇怪”。

    好了,俺的大数运算库源代码将附在本贴之后(点击下载),在VC中可以
    直接编译通过,如果大家在使用中发现有Bug,希望能够通
    知俺及时改正,谢谢!
MFC功能扩展:大数运算及RSA算法库  MFC功能扩展:大数运算及RSA算法库用MFC太久,习惯了MFC风格,以至于对各种流行的大数运算及RSA库都看着不爽。。。而MFC本身并不提供相关功能,余好事者也,曾为之扩展。/*****************************************************************大数运算库头文件:BigInt.h作者:fangle.liu@gmail.com版 阅读详情

相关推荐

大数运算和RSA加密算法

大数运算和RSA加密算法

RSA大数运算实现(1024位n) (1)

RSA大数运算(1024位)综述数据结构和宏数据结构及宏bignum.h中的函数定义bignum.h中函数声明函数实现方法加法减法乘法乘法算法除法取模数论中的一些函数求最大公因子和求逆模幂运算费马素性检测中国剩余定理实现的数论函数位运算函数左移右移获得二进制位数实现的位运算函数特殊操作函数求前几十个素数的乘积,存在文件中产生指定二进制位数大随机数(利用SHA-1和rand())寻找指定二进制位数素...

威化饼的一隅 1万+

C++ 超大整数类 及RSA加密

C++ 超大整数类 及RSA加密 功能特别强大的适用于非负整数的大整数类 并用于RSA加密解密

RSA加密算法及其证明 大数RSA问题解决方案

当我们给定公钥e与n时,对于很大的n,其欧拉函数的值是很难求解的(只有采取质因数分解的方法,而大数的质因数分解几乎是计算上不可行的)。 因此便很难求出私钥。

qq_51533157的博客 4566

密码学RSA 算法源码及大数运算的实现原理

密码学 RSA 算法 c语言源码 大数运算 实现原理 很不错的 运行过

RSA加解密及大数计算的实现

RSA加解密,BigInt大数计算的实现

RSA算法的介绍与实现

RSA算法的介绍A. 加密解密1. 密钥的产生1) 找出两个相异的大素数P和Q,令N=P×Q,M=(P-1)(Q-1)。2) 找出与M互素的大数E,用欧氏算法计算出大数D,使D×E≡1 MOD M。3) 丢弃P和Q,公开E,D和N。E和N即加密密钥,D和N即解密密钥。2. 加密的步骤1) 计算N的有效位数tn(以字节数计),将最高位的零忽略掉,令tn1=tn-1。比如N=0x012A05,

Net_Wolf_007的专栏 2956

大数运算-RSA-c语言大数运算库

大数运算 RSA c语言大数运算库 英文PDf 中文PDF 源码

RSA大数运算实现(1024位)(2)

接上一篇文章   在有了大数运算库之后,实现RSA完全不在话下了! RSA算法 ①随机选择两个大素数p和q,计算n=p·q,以及φ(n)=(p-1)·(q-1) ; ②选择e=65537,如果不满足(e,φ(n))=1,则选择一个随机整数(e,φ(n))=1。 ③求出私钥d,使得e·d=1(mod φ(n))。 ④加密时,明文为M,密文C=Me mod n; ⑤解密时,密文为C,解密后明文M’= ...

威化饼的一隅 8363

RSA算法之大数实现

java利用大整数类实现的一个RSA加解密签名过程。

从USB 2.0到USB 3.x:Synopsys SVT USB VIP配置避坑与接口选择指南

本文详细解析了从USB 2.0到USB 3.x的Synopsys SVT USB VIP配置要点,涵盖协议版本选择、物理接口匹配及UVM层次化架构实现。重点介绍了layering sequence的配置技巧和常见问题解决方案,帮助验证工程师高效避坑并优化验证流程。

weixin_42653691的博客 238

RSA与大数运算(C语言)

========================================================================== 前言:此文来自于www.pediy.com一位Cracker---afanty之手。他建立了一个VC++(MFC)版的大数运算库

cmj198799的专栏 3202

逆向实战:Soul聊天协议加密与Frida绕过检测

本文详细解析了Soul聊天协议逆向分析的全过程,重点介绍了如何利用Frida绕过应用的反调试检测机制。通过静态分析定位关键SO库,并编写Frida脚本动态Hook线程创建函数,成功实现对抗。文章还进一步追踪了基于DES算法的加密流程,并探讨了协议数据结构的解析方法,为移动应用安全研究提供了实战参考。

2w3e4r5t6y的博客 1132

C语言RSA大数运算库,[转载]RSA大数运算库  c++实现

转自http://blog.chinaunix.net/u1/50055/showart_1686985.html基于以下原因,俺估计RSA算法会被越来越多的共享软件采用:1、原理简洁易懂2、加密强度高3、专利限制已过期4、看雪老大三番五次呼吁共享软件采用成熟的非对称加密技术所以,大家应该对RSA算法进行深入了解。RSA依赖大数运算,目前主流RSA算法都建立在512位到1024位的大数运算之上,所...

weixin_33268464的博客 1425

Tiny windows 11 安装与部署

需要注意,安装完后键入 windows 键,输入 update 先更新系统。点击开始,等待完成即可,用户可自定义。

m0_73351035的博客 9047

Badcase归因分析“四部曲”

badcase是业内的专业名词,简单解释一下。bad是坏,case是案例,说白了就是模型或者具体规则无法很好预测的那些案例。以分类模型为例,本来一个样本应该是负类的,结果预测为正类,那这个样本就能被称为bad case。那相对应的就是good case就是优秀案例。

qq_25438419的博客 3518

大数运算和RSA算法

(要测试代码的发Email给wwb206@163.com)前几天不忙,于是想起加密算法,但是RSA加密是依赖大数运算,而且主流RSA算法都建立在512位到1024位的。而现有的计算机数据类型最大的也就是64(int64),于是自己编了一个大数类CXWord来实现1024位的大数运算。基本思想就是用DWORD[32]的数组来存储,具体实现如下。(为加快运行速度,所有的函数都是内联的)/*****

wwwwbb78的专栏 3039

Ubuntu 24.04 高效部署Slurm集群:从零到生产环境实战

本文提供了一份在Ubuntu 24.04 LTS系统上从零开始部署生产级Slurm高性能计算集群的完整实战指南。内容涵盖网络配置、Munge安全认证、Slurm核心组件安装与配置,并深入讲解了cgroups资源隔离、NFS共享存储、配置无感知模式等生产环境优化技巧,最后通过实例演示如何提交与管理Slurm作业,帮助用户构建高效、稳定的计算平台。

weixin_29213655的博客 564

RSA大数运算库

自己曾经查阅了网上找得到的各种用于实现RSA 的大数运算库,然而最终还是决 定自己动手写一个。因为凡是效率高速度快的代码(crypto++、miracl、freelip、 rsaref等),要么使用的数据结构过于复杂,要么编码风格杂乱无章,自己的水平和 耐心都实在是有限,以至于无法读懂这些东西。而俺读得懂的一些代码,其实现方 式却又过于幼稚,效率极低速度一塌糊涂。俺觉得像俺这样的人不在少数

kevin900616的专栏 4822

N5105核显直通PVE:从黑屏到HDMI输出的完整指南

PCI直通能让虚拟机独占物理设备,但核显直通远没有独显那么轻松。Intel核显与CPU、显示输出链路的强耦合使UEFI引导、GOP驱动、驱动签名等环节都成了黑屏陷阱。在PVE虚拟化环境中,通过IOMMU开启、vfio-pci绑定、OVMF固件和Q35机型配合,可以绕过KVM检测,让Windows虚拟机正确驱动核显,从HDMI口输出画面,并解锁Intel Quick Sync硬解能力。这种方案尤其适合N5105等低功耗迷你主机,可作为客厅HTPC、本地视频硬解或依赖硬件加速的轻量工作台。本文基于N5105平台

weixin_31082403的博客 374

学习STM32的CAN总线通信

在配置时,确保您启用了CAN总线功能。CAN节点是CAN总线上的一个设备,每个节点都有唯一的标识符。在CAN总线中,有两种类型的节点:CAN控制器和CAN外设。步骤2:配置CAN总线 在STM32CubeMX中,选择CAN总线模块并进行必要的配置。在CAN总线中,有两个重要的概念:CAN节点和CAN帧。步骤5:测试CAN总线通信 在成功编译和烧录代码后,您可以使用串口调试助手或其他CAN总线工具来测试CAN总线通信。步骤3:编写CAN总线通信代码 在项目的主代码文件中,我们将编写CAN总线通信的示例代码。

2401_85258012的博客 496

《RSA与大数运算》

标 题:《RSA与大数运算》 发信人:afanty 时 间:2003/04/28 04:50pm详细信息: 基于以下原因,俺估计RSA算法会被越来越多的共享软件采用:1、原理简洁易懂2、加密强度高3、专利限制已过期4、看雪老大三番五次呼吁共享软件采用成熟的非对称加密技术 所以,大家应该对RSA算法进行深入了解。 RSA依赖大数运算,目前主流RSA算法都建立在512位到1024位

Mycro的专栏 4630

复旦微FMSH_Procise安装流程

双击FMSH_Procise_2021.1_full_win64_202103151947.exe 选择好安装目录后点击“Next” 一路next 点install 找技术支持代为申请 License,将电脑MAC地址发过去,将获得的 license 拷贝到 procise 安装目录“data”文件夹,即可使用 procise。点license manager和copy license 将licence,.lic文件放到这个目录 要是报下面错误要...

wangjie36的博客 1万+
上一篇: 东南大学第三届Robocup机器人仿真足球赛——第一名!
下一篇: Humaniod开发小结
zhulingchen
博客等级 码龄20年 71粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值