2023-07-14实习笔记

111 阅读2分钟

1.公钥加密的原理是什么?

数字签名的原理基于公钥加密技术。其过程主要包括三个步骤:签名、发送和验证。在签名阶段,发送者使用公钥对信息内容进行加密,生成一个唯一的数字签名。然后,他们将原始信息和数字签名一起发送出去。在接收端,接收者使用私钥对数字签名进行解密。如果解密后的信息内容与接收到的原始信息即公钥一致,那么数字签名就被认为是有效的,否则就被认为是无效的。这样就能确保信息的完整性和发送者的身份真实性,防止信息在传输过程中被篡改和伪装。

2.RSA加密算法的基本过程是什么?

RSA加密算法是一种非对称加密算法,基于两个密钥,即公钥和私钥。其基本过程如下:

  1. 密钥生成:选择两个大素数p和q,并计算它们的乘积n(n = p * q),以及欧拉函数值φ(n)(φ(n) = (p-1) * (q-1))。然后选择一个与φ(n)互质的数e(1 < e < φ(n)),作为公钥的指数。最后,计算出私钥的指数d,使得(e * d) % φ(n) = 1。

  2. 加密:将明文消息转化为整数m,并使用公钥的指数e和模数n,计算密文c,即 c = m^e mod n。

  3. 解密:将密文c使用私钥的指数d和模数n,计算出原始的明文消息m,即 m = c^d mod n。

在保持私钥的安全性的前提下,公钥可以公开给其他人使用,以便加密消息。这样,只有持有私钥的人可以解密密文,获取明文消息。RSA加密算法的安全性基于大整数因子分解问题的困难性,即将一个大整数分解为其素数因子的难度。

3.java 并发编程如何使用三个顺序打印 1 2 3 ... 到100

你可以使用Java的多线程和同步机制来实现三个线程顺序打印1到100之间的数字。下面是一个示例代码:

public class SequentialPrinting implements Runnable {
    private static final int MAX_NUMBER = 100;
    private static final Object lock = new Object();
    private static int number = 1;
    private int threadId;
    private int increment;

    public SequentialPrinting(int threadId, int increment) {
        this.threadId = threadId;
        this.increment = increment;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (lock) {
                if (number > MAX_NUMBER) {
                    break;
                }

                // 检查当前线程是否可以输出数字
                if (number % 3 == threadId) {
                    System.out.println("Thread " + threadId + ": " + number);
                    number++;
                }

                // 唤醒下一个线程
                lock.notifyAll();

                // 当前线程进入等待状态
                if (number <= MAX_NUMBER) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        Thread t1 = new Thread(new SequentialPrinting(0, 3));
        Thread t2 = new Thread(new SequentialPrinting(1, 3));
        Thread t3 = new Thread(new SequentialPrinting(2, 3));

        t1.start();
        t2.start();
        t3.start();
    }
}

这段代码创建了三个线程,每个线程通过计算线程ID和数字的余数来确定是否轮到自己输出数字。每个线程在输出数字后会唤醒下一个线程,并进入等待状态,直到轮到自己输出数字为止。使用synchronized关键字以及wait()和notifyAll()方法来实现线程的同步和顺序输出。运行该代码,你可以看到三个线程按照顺序打印出1到100之间的数字。