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

📄 rsa.java

📁 用JAVA实现Rsa非对称加密算法 不算简单的算法 既可以加密又可以解密
💻 JAVA
字号:
import java.io.*;
import java.util.Random;


public class Rsa
{
    private int keyn;            //公私钥相同部分
    private int publickeye;        //公钥
    private int privatekeyd;    //私钥
                                //Rsa构造器,初始化对象
    public Rsa()
    {
        int randomprimep = 0;    //随机产生素数
        int randomprimeq = 0;    //随机产生素数
        int eulern = 0;    //公私钥相同部分的欧拉数
        Random rand = new Random();
        randomprimep = 10 + rand.nextInt(200);
        while (ifPrime(randomprimep))    //判断是否为素数
        {
            randomprimep = 10 + rand.nextInt(200);
        }
        randomprimeq = 10 + rand.nextInt(200);
        while (ifPrime(randomprimeq))    //判断是否为素数
       {
            randomprimeq = 10 + rand.nextInt(200);
        }
        keyn = randomprimep * randomprimeq;
        eulern = (randomprimep - 1) * (randomprimeq - 1);
        randomprimep = randomprimeq = 0;    //销毁两个随机素数
        publickeye = 10 + rand.nextInt(200);        //随机产生公钥
        while (relativePrime(publickeye,eulern))    //判断随机公钥与公私钥相同部分的欧拉数是否为相对素数
        {
            publickeye = 10 + rand.nextInt(200);
        }
        boolean mark = true;    //用简捷方法求私钥,从模逆运算原始定义出发
        int k = 0;
        while (mark)
        {
            k++;
            if((k * eulern + 1)%publickeye == 0)
                mark = false;
        }
        privatekeyd = (k * eulern + 1)/publickeye;        //计算私钥
        System.out.println("公钥为:(" + publickeye + "," + keyn + ")");
        System.out.println("私钥为:(" + privatekeyd + "," + keyn + ")");
    }

    //判断一个整型数据是否为素数*@param number 待判断数据*@return true --不是素数,false -- 是素数
    public boolean ifPrime(int number)
    {
        boolean mark = false;
        for (int i = 2;i < number/2 ;i++ )
        {
            if (number%i == 0)
            {
                mark = true;
                break;
            }
        }
        return mark;
    }

    //*判断两个整数数据是否为素数*@param e 整型数据*@param n 整型数据*@return true -- 不是否为素数,fasle -- 是互为素数
    public boolean relativePrime(int e,int n)
    {
        boolean mark = false;
        for (int i = 2;i <= n ;i++ )
        {
            if (n%i == 0)
                if (e%i == 0)
                {
                    mark = true;
                    break;
                }
        }
        return mark;
    }

    //*模n的大数幂乘快速运算*@param a 底数*@param b 指数*@param n 模数*@return 大数幂乘结果
    public int fastPowerMultiplication(int a,int b,int n)
   {
        int c = 1;
        while (b != 0)
        {
            while (b%2 == 0)
            {
                b = b/2;
                a = ( a * a )%n;
            }
            b = b - 1;
            c = ( c * a )%n;
        }
        return c;
    }


    //***求一个整型数据的欧拉数*@param number 待求欧拉数的数据*@return 欧拉数
    public int getPrivateKeyexp(int number)
   {
        int eulernumber = 0;
        for (int i = 2;i < number ;i++ )
       {
            if(relativePrime(i,number) == false)
            {
                System.out.println("相互素数:" + i + "," + number);
                eulernumber++;
            }
        }
        System.out.println(eulernumber);
        return eulernumber + 1;
    }

    //***对明文加密*@param source 明文源地址*@param destination 密文目的地
    public void dataEncryption(String source,String destination)
    {
        try
        {
            RandomAccessFile rafr = new RandomAccessFile(source,"r");
            RandomAccessFile rafw = new RandomAccessFile(destination,"rw");
            String understandtxts = "";
            String passwordtxts = "";
            char [] eachchar;
            int charint = 0;
            boolean mark = false;
            try
           {
                long filelength = rafr.length();
                long pos = 0;
                while (pos != filelength)
                {
                    understandtxts = rafr.readLine();
                    eachchar = understandtxts.toCharArray();
                    for (int i = 0 ;i < eachchar.length ;i++ )
                    {
                        charint = (int)eachchar[i];
                        if (charint > 127 || charint < 10)
                        {
                            System.out.println("加密失败!原文中包含不能加密的字符。");
                            mark = true;
                            break;
                        }
                    }
                    if (mark)
                    {
                        break;
                    }
                    pos = rafr.getFilePointer();
                }
                rafr.seek(0);
                pos = 0;
                if (!mark)
              {
                    System.out.println("从文件读入明文:");
                    while (pos != filelength)
                    {
                        System.out.println(rafr.readLine());
                        pos = rafr.getFilePointer();
                    }
                    rafr.seek(0);
                    pos = 0;
                    System.out.println("明文加密后密文:");
                    while (true)
                   {
                        understandtxts = rafr.readLine();
                        eachchar = understandtxts.toCharArray();
                        for (int i = 0;i < eachchar.length ;i++ )
                       {
              passwordtxts = passwordtxts + fastPowerMultiplication((int)eachchar[i],publickeye,keyn) + getRandomString();
                        }
                        System.out.println(passwordtxts);
                        rafw.writeBytes(passwordtxts);
                        pos = rafr.getFilePointer();
                        if (pos == filelength)
                      {
                            break;
                        }
                        passwordtxts = "";
                        rafw.writeChar(' ');
                    }
                }
            }
            catch (Exception e)
           {
                e.printStackTrace(System.out);
            }
            finally
           {
                rafr.close();
                rafw.close();
            }
        }
        catch (IOException ex)
       {
            ex.printStackTrace(System.out);
        }
    }

    //***随机生成1~5个随机大写字母
    public String getRandomString()
   {
        Random rand = new Random();
        String randstr = "";
        int number = 1 + rand.nextInt(5);
        int charint = 65 + rand.nextInt(26);
        for (int i = 0;i < number ;i++ )
        {
            randstr = randstr + (char)charint;
            charint = 65 + rand.nextInt(26);
        }
        return randstr;
    }

    //***对密文解密*@param source 密文源地址*@param destination 明文目的址
    public void dataDeciphering(String source,String destination)
   {
        try
       {
            RandomAccessFile rafr = new RandomAccessFile(source,"r");
            RandomAccessFile rafw = new RandomAccessFile(destination,"rw");
            String understandtxts = "";
            String passwordtxts = "";
            char [] eachchar;
            int intchar = 0;
            boolean mark = false;
            try
            {
                long filelength = rafr.length();
                long pos = 0;
                int j = 0;
                System.out.println("密文解密后明文:");
                while (true)
                {
                    passwordtxts = rafr.readLine();
                    eachchar = passwordtxts.toCharArray();
                    for (int i = 0;i < eachchar.length ;i++ )
                   {
                        if (Character.isDigit(eachchar[i]))
                        {
                            intchar = 10*intchar + Integer.valueOf(String.valueOf(eachchar[i]));
                        }
                        else
                        {
                            j = i - 1;
                            if (Character.isDigit(eachchar[j]) && !Character.isDigit(eachchar[i]))
                          {
                                understandtxts = understandtxts + (char)fastPowerMultiplication(intchar,privatekeyd,keyn);
                                intchar = 0;
                            }
                        }
                    }
                    System.out.println(understandtxts);
                    rafw.writeBytes(understandtxts);
                    pos = rafr.getFilePointer();
                    if (pos == filelength)
                   {
                        break;
                    }
                    System.out.println(' ');
                    understandtxts = "";
                }
            }
            catch (Exception e)
            {
                e.printStackTrace(System.out);
            }
            finally
           {
                rafr.close();
                rafw.close();
            }
        }
        catch (IOException ex)
       {
            ex.printStackTrace(System.out);
        }
    }
    public static void main(String[] args)
   {
        Rsa rsa = new Rsa();
        rsa.dataEncryption("b.txt","c.txt");
        rsa.dataDeciphering("c.txt","d.txt");
    }
}

⌨️ 快捷键说明

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