⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 biginteger.cs

📁 RSA算法的加解密模拟程序
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;

namespace RSA
{
    public sealed class BigInteger
    {
        private const int maxLength = 80; //最大32位无符号整数长度,80*32 = 2560位
        private uint[] data;              //用于保存大数组      
        public int dataLength;            //实际使用32位无符号整数长度
        //用无符号整形数构造

        public BigInteger(String inData)
        {
            dataLength = inData.Length;
            if (dataLength > maxLength)
                throw (new ArithmeticException("用无符号整形数构造溢出。"));
            data = new uint[maxLength];
            for (int i = dataLength - 1, j = 0; i >= 0; i--, j++) 
                data[j] = inData[i] - 48;
        }
        //重载 + 运算 
        
        public static BigInteger operator +(BigInteger bi1, BigInteger bi2) {
            BigInteger result = new BigInteger();
            result.dataLength = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
            long carry = 0;
            for (int i = 0; i < result.dataLength; i++)
            {
                long sum = (long)bi1.data[i] + (long)bi2.data[i] + carry;
                carry = sum >> 32;
                result.data[i] = (uint)(sum & 0xFFFFFFFF);
            }
            return result;
         }

        public static BigInteger operator -(BigInteger bi1, BigInteger bi2) {
            BigInteger result = new BigInteger();
            result.dataLength = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
            long carryIn = 0;
            for (int i = 0; i < result.dataLength; i++)
            {
                long diff = (long)bi1.data[i] - (long)bi2.data[i] - carryIn;
                result.data[i] = (uint)(diff & 0xFFFFFFFF);
                carryIn = (diff < 0) ? 1 : 0;
            }
            // 若进位位〈0高位部分设置为负数补码形式
            if (carryIn != 0)
            {
                for (int i = result.dataLength; i < maxLength; i++)
                    result.data[i] = 0xFFFFFFFF;
                result.dataLength = maxLength;
            }
            while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0) 
                result.dataLength--;
            return result;
         }

        public static BigInteger operator *(BigInteger bi1, BigInteger bi2) {
            int lastPos = maxLength - 1;
            bool bi1Neg = false, bi2Neg = false;
            // 取绝对值
            if ((bi1.data[lastPos] & 0x80000000) != 0)
            { // bi1 是负数
                bi1Neg = true; bi1 = -bi1;
            }
            if ((bi2.data[lastPos] & 0x80000000) != 0)
            {     // bi2 是负数
                bi2Neg = true; bi2 = -bi2;
            }
            BigInteger result = new BigInteger();
            // 绝对值乘法
            for (int i = 0; i < bi1.dataLength; i++)
            {
                if (bi1.data[i] == 0) continue;
                ulong mcarry = 0;
                for (int j = 0, k = i; j < bi2.dataLength; j++, k++)
                {
                    ulong val = (bi1.data[i] * bi2.data[j]) + result.data[k] + mcarry;
                    result.data[k] = (uint)(val & 0xFFFFFFFF);
                    mcarry = (val >> 32);
                }
                if (mcarry != 0) result.data[i + bi2.dataLength] = (uint)mcarry;
            }
            result.dataLength = bi1.dataLength + bi2.dataLength;
            if (result.dataLength > maxLength) 
                result.dataLength = maxLength;
            while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0) 
                result.dataLength--;
            // 输入的两个数符号相反,则为 -ve
            if (bi1Neg != bi2Neg) 
                return -result;
            return result;
         }

        public static BigInteger operator /(BigInteger bi1, BigInteger bi2) {

         }

        public static BigInteger operator %(BigInteger bi1, BigInteger bi2) {

         }
        

    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -