java里modulus的简单介绍

博主:adminadmin 2022-11-28 11:50:08 46

本篇文章给大家谈谈java里modulus,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

RSA PKCS#1在java中怎么实现?

楼主看看下面的代码是不是你所需要的,这是我原来用的时候收集的

import javax.crypto.Cipher;

import java.security.*;

import java.security.spec.RSAPublicKeySpec;

import java.security.spec.RSAPrivateKeySpec;

import java.security.spec.InvalidKeySpecException;

import java.security.interfaces.RSAPrivateKey;

import java.security.interfaces.RSAPublicKey;

import java.io.*;

import java.math.BigInteger;

/**

* RSA 工具类。提供加密,解密,生成密钥对等方法。

* 需要到下载bcprov-jdk14-123.jar。

* RSA加密原理概述

* RSA的安全性依赖于大数的分解,公钥和私钥都是两个大素数(大于100的十进制位)的函数。

* 据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积

* ===================================================================

* (该算法的安全性未得到理论的证明)

* ===================================================================

* 密钥的产生:

* 1.选择两个大素数 p,q ,计算 n=p*q;

* 2.随机选择加密密钥 e ,要求 e 和 (p-1)*(q-1)互质

* 3.利用 Euclid 算法计算解密密钥 d , 使其满足 e*d = 1(mod(p-1)*(q-1)) (其中 n,d 也要互质)

* 4:至此得出公钥为 (n,e) 私钥为 (n,d)

* ===================================================================

* 加解密方法:

* 1.首先将要加密的信息 m(二进制表示) 分成等长的数据块 m1,m2,...,mi 块长 s(尽可能大) ,其中 2^sn

* 2:对应的密文是: ci = mi^e(mod n)

* 3:解密时作如下计算: mi = ci^d(mod n)

* ===================================================================

* RSA速度

* 由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论是软件还是硬件实现。

* 速度一直是RSA的缺陷。一般来说只用于少量数据加密。

* 文件名:RSAUtil.javabr

* @author 赵峰br

* 版本:1.0.1br

* 描述:本算法摘自网络,是对RSA算法的实现br

* 创建时间:2009-7-10 下午09:58:16br

* 文件描述:首先生成两个大素数,然后根据Euclid算法生成解密密钥br

*/

public class RSAUtil {

//密钥对

private KeyPair keyPair = null;

/**

* 初始化密钥对

*/

public RSAUtil(){

try {

this.keyPair = this.generateKeyPair();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 生成密钥对

* @return KeyPair

* @throws Exception

*/

private KeyPair generateKeyPair() throws Exception {

try {

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider());

//这个值关系到块加密的大小,可以更改,但是不要太大,否则效率会低

final int KEY_SIZE = 1024;

keyPairGen.initialize(KEY_SIZE, new SecureRandom());

KeyPair keyPair = keyPairGen.genKeyPair();

return keyPair;

} catch (Exception e) {

throw new Exception(e.getMessage());

}

}

/**

* 生成公钥

* @param modulus

* @param publicExponent

* @return RSAPublicKey

* @throws Exception

*/

private RSAPublicKey generateRSAPublicKey(byte[] modulus, byte[] publicExponent) throws Exception {

KeyFactory keyFac = null;

try {

keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

} catch (NoSuchAlgorithmException ex) {

throw new Exception(ex.getMessage());

}

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(publicExponent));

try {

return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);

} catch (InvalidKeySpecException ex) {

throw new Exception(ex.getMessage());

}

}

/**

* 生成私钥

* @param modulus

* @param privateExponent

* @return RSAPrivateKey

* @throws Exception

*/

private RSAPrivateKey generateRSAPrivateKey(byte[] modulus, byte[] privateExponent) throws Exception {

KeyFactory keyFac = null;

try {

keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

} catch (NoSuchAlgorithmException ex) {

throw new Exception(ex.getMessage());

}

RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(modulus), new BigInteger(privateExponent));

try {

return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);

} catch (InvalidKeySpecException ex) {

throw new Exception(ex.getMessage());

}

}

/**

* 加密

* @param key 加密的密钥

* @param data 待加密的明文数据

* @return 加密后的数据

* @throws Exception

*/

public byte[] encrypt(Key key, byte[] data) throws Exception {

try {

Cipher cipher = Cipher.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

cipher.init(Cipher.ENCRYPT_MODE, key);

// 获得加密块大小,如:加密前数据为128个byte,而key_size=1024 加密块大小为127 byte,加密后为128个byte;

// 因此共有2个加密块,第一个127 byte第二个为1个byte

int blockSize = cipher.getBlockSize();

// System.out.println("blockSize:"+blockSize);

int outputSize = cipher.getOutputSize(data.length);// 获得加密块加密后块大小

// System.out.println("加密块大小:"+outputSize);

int leavedSize = data.length % blockSize;

// System.out.println("leavedSize:"+leavedSize);

int blocksSize = leavedSize != 0 ? data.length / blockSize + 1 : data.length / blockSize;

byte[] raw = new byte[outputSize * blocksSize];

int i = 0;

while (data.length - i * blockSize 0) {

if (data.length - i * blockSize blockSize)

cipher.doFinal(data, i * blockSize, blockSize, raw, i * outputSize);

else

cipher.doFinal(data, i * blockSize, data.length - i * blockSize, raw, i * outputSize);

// 这里面doUpdate方法不可用,查看源代码后发现每次doUpdate后并没有什么实际动作除了把byte[]放到ByteArrayOutputStream中

// 而最后doFinal的时候才将所有的byte[]进行加密,可是到了此时加密块大小很可能已经超出了OutputSize所以只好用dofinal方法。

i++;

}

return raw;

} catch (Exception e) {

throw new Exception(e.getMessage());

}

}

/**

* 解密

* @param key 解密的密钥

* @param raw 已经加密的数据

* @return 解密后的明文

* @throws Exception

*/

@SuppressWarnings("static-access")

public byte[] decrypt(Key key, byte[] raw) throws Exception {

try {

Cipher cipher = Cipher.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

cipher.init(cipher.DECRYPT_MODE, key);

int blockSize = cipher.getBlockSize();

ByteArrayOutputStream bout = new ByteArrayOutputStream(64);

int j = 0;

while (raw.length - j * blockSize 0) {

bout.write(cipher.doFinal(raw, j * blockSize, blockSize));

j++;

}

return bout.toByteArray();

} catch (Exception e) {

throw new Exception(e.getMessage());

}

}

/**

* 返回公钥

* @return

* @throws Exception

*/

public RSAPublicKey getRSAPublicKey() throws Exception{

//获取公钥

RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();

//获取公钥系数(字节数组形式)

byte[] pubModBytes = pubKey.getModulus().toByteArray();

//返回公钥公用指数(字节数组形式)

byte[] pubPubExpBytes = pubKey.getPublicExponent().toByteArray();

//生成公钥

RSAPublicKey recoveryPubKey = this.generateRSAPublicKey(pubModBytes,pubPubExpBytes);

return recoveryPubKey;

}

/**

* 获取私钥

* @return

* @throws Exception

*/

public RSAPrivateKey getRSAPrivateKey() throws Exception{

// 获取私钥

RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();

// 返回私钥系数(字节数组形式)

byte[] priModBytes = priKey.getModulus().toByteArray();

// 返回私钥专用指数(字节数组形式)

byte[] priPriExpBytes = priKey.getPrivateExponent().toByteArray();

// 生成私钥

RSAPrivateKey recoveryPriKey = this.generateRSAPrivateKey(priModBytes,priPriExpBytes);

return recoveryPriKey;

}

/**

* 测试

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

RSAUtil rsa = new RSAUtil();

String str = "天龙八部、神雕侠侣、射雕英雄传白马啸西风";

RSAPublicKey pubKey = rsa.getRSAPublicKey();

RSAPrivateKey priKey = rsa.getRSAPrivateKey();

// System.out.println("加密后==" + new String(rsa.encrypt(pubKey,str.getBytes())));

String mw = new String(rsa.encrypt(pubKey, str.getBytes()));

System.out.println("加密后:"+mw);

// System.out.println("解密后:");

System.out.println("解密后==" + new String(rsa.decrypt(priKey,rsa.encrypt(pubKey,str.getBytes()))));

}

}

java中如何得到公钥的key size

接你代码后面

String algorithm = publickey.getAlgorithm(); // 获取算法

KeyFactory keyFact = KeyFactory.getInstance(algorithm);

BigInteger prime = null;

if ("RSA".equals(algorithm)) { // 如果是RSA加密

RSAPublicKeySpec keySpec = (RSAPublicKeySpec)keyFact.getKeySpec(publickey, RSAPublicKeySpec.class);

prime = keySpec.getModulus();

} else if ("DSA".equals(algorithm)) { // 如果是DSA加密

DSAPublicKeySpec keySpec = (DSAPublicKeySpec)keyFact.getKeySpec(publickey, DSAPublicKeySpec.class);

prime = keySpec.getP();

}

int len = prime.toString(2).length(); // 转换为二进制,获取公钥长度

在java中使用KeyFactory将给定字符串转换为RSAPublicKey对象时报错公钥非法

 //将byte数组变成RSAPublicKey

public RSAPublicKey bytes2PK(byte[] buf) {

 buf=Base64.decode(buf);

 byte size=buf[0];

   byte size2=buf[1];

 byte[] b1 = new byte[size];

   System.arraycopy(buf,2,b1,0,b1.length);

   byte[] b2 = new byte[size2];

 System.arraycopy(buf,b1.length+2,b2,0,b2.length);

 BigInteger B1 = new BigInteger(b1);

   BigInteger B2 = new BigInteger(b2);

   RSAPublicKeySpec spec = new RSAPublicKeySpec(B1, B2);//存储的就是这两个大整形数

 KeyFactory keyFactory;

 PublicKey pk = null;

 try {

 keyFactory = KeyFactory.getInstance("RSA");

 pk = keyFactory.generatePublic(spec);

   } catch (Exception e) {

 e.printStackTrace();

 }

return (RSAPublicKey)pk;

}

公钥所包含的数据,实际上就是modulus、publicExponent这两个。都可以用byte数组的方式表示。我这边为了网络传输方便,将两个byte数组拼接在了一起。实际上分开存储更容易理解。

java 中 mod 是什么意思

java中mod放入意思是取模,或者说是取余,就是得到除法算式的余数。

例如:

int i , a = 10 , b = 3; //定义变量

i = a mod b; //相当于 i = a % b ;计算结果是 i 的值为1

我想问一下 java 中没有有Complex 这个变量,是需要自己定义吗?可是我看有些代码是直接用的。代码如下

从你的问题描述看你是问是否有一个复数类型complex,我查了一下没有,都是自己定义的。下面的代码你可以参考:

/******************************************************************************

 *  Compilation:  javac Complex.java

 *  Execution:    java Complex

 *

 *  Data type for complex numbers.

 *

 *  The data type is "immutable" so once you create and initialize

 *  a Complex object, you cannot change it. The "final" keyword

 *  when declaring re and im enforces this rule, making it a

 *  compile-time error to change the .re or .im instance variables after

 *  they've been initialized.

 *

 *  % java Complex

 *  a            = 5.0 + 6.0i

 *  b            = -3.0 + 4.0i

 *  Re(a)        = 5.0

 *  Im(a)        = 6.0

 *  b + a        = 2.0 + 10.0i

 *  a - b        = 8.0 + 2.0i

 *  a * b        = -39.0 + 2.0i

 *  b * a        = -39.0 + 2.0i

 *  a / b        = 0.36 - 1.52i

 *  (a / b) * b  = 5.0 + 6.0i

 *  conj(a)      = 5.0 - 6.0i

 *  |a|          = 7.810249675906654

 *  tan(a)       = -6.685231390246571E-6 + 1.0000103108981198i

 *

 ******************************************************************************/

import java.util.Objects;

public class Complex {

    private final double re;   // the real part

    private final double im;   // the imaginary part

    // create a new object with the given real and imaginary parts

    public Complex(double real, double imag) {

        re = real;

        im = imag;

    }

    // return a string representation of the invoking Complex object

    public String toString() {

        if (im == 0) return re + "";

        if (re == 0) return im + "i";

        if (im   0) return re + " - " + (-im) + "i";

        return re + " + " + im + "i";

    }

    // return abs/modulus/magnitude

    public double abs() {

        return Math.hypot(re, im);

    }

    // return angle/phase/argument, normalized to be between -pi and pi

    public double phase() {

        return Math.atan2(im, re);

    }

    // return a new Complex object whose value is (this + b)

    public Complex plus(Complex b) {

        Complex a = this;             // invoking object

        double real = a.re + b.re;

        double imag = a.im + b.im;

        return new Complex(real, imag);

    }

    // return a new Complex object whose value is (this - b)

    public Complex minus(Complex b) {

        Complex a = this;

        double real = a.re - b.re;

        double imag = a.im - b.im;

        return new Complex(real, imag);

    }

    // return a new Complex object whose value is (this * b)

    public Complex times(Complex b) {

        Complex a = this;

        double real = a.re * b.re - a.im * b.im;

        double imag = a.re * b.im + a.im * b.re;

        return new Complex(real, imag);

    }

    // return a new object whose value is (this * alpha)

    public Complex scale(double alpha) {

        return new Complex(alpha * re, alpha * im);

    }

    // return a new Complex object whose value is the conjugate of this

    public Complex conjugate() {

        return new Complex(re, -im);

    }

    // return a new Complex object whose value is the reciprocal of this

    public Complex reciprocal() {

        double scale = re*re + im*im;

        return new Complex(re / scale, -im / scale);

    }

    // return the real or imaginary part

    public double re() { return re; }

    public double im() { return im; }

    // return a / b

    public Complex divides(Complex b) {

        Complex a = this;

        return a.times(b.reciprocal());

    }

    // return a new Complex object whose value is the complex exponential of this

    public Complex exp() {

        return new Complex(Math.exp(re) * Math.cos(im), Math.exp(re) * Math.sin(im));

    }

    // return a new Complex object whose value is the complex sine of this

    public Complex sin() {

        return new Complex(Math.sin(re) * Math.cosh(im), Math.cos(re) * Math.sinh(im));

    }

    // return a new Complex object whose value is the complex cosine of this

    public Complex cos() {

        return new Complex(Math.cos(re) * Math.cosh(im), -Math.sin(re) * Math.sinh(im));

    }

    // return a new Complex object whose value is the complex tangent of this

    public Complex tan() {

        return sin().divides(cos());

    }

    

    // a static version of plus

    public static Complex plus(Complex a, Complex b) {

        double real = a.re + b.re;

        double imag = a.im + b.im;

        Complex sum = new Complex(real, imag);

        return sum;

    }

    // See Section 3.3.

    public boolean equals(Object x) {

        if (x == null) return false;

        if (this.getClass() != x.getClass()) return false;

        Complex that = (Complex) x;

        return (this.re == that.re)  (this.im == that.im);

    }

    // See Section 3.3.

    public int hashCode() {

        return Objects.hash(re, im);

    }

    // sample client for testing

    public static void main(String[] args) {

        Complex a = new Complex(5.0, 6.0);

        Complex b = new Complex(-3.0, 4.0);

        StdOut.println("a            = " + a);

        StdOut.println("b            = " + b);

        StdOut.println("Re(a)        = " + a.re());

        StdOut.println("Im(a)        = " + a.im());

        StdOut.println("b + a        = " + b.plus(a));

        StdOut.println("a - b        = " + a.minus(b));

        StdOut.println("a * b        = " + a.times(b));

        StdOut.println("b * a        = " + b.times(a));

        StdOut.println("a / b        = " + a.divides(b));

        StdOut.println("(a / b) * b  = " + a.divides(b).times(b));

        StdOut.println("conj(a)      = " + a.conjugate());

        StdOut.println("|a|          = " + a.abs());

        StdOut.println("tan(a)       = " + a.tan());

    }

}

关于java里modulus和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-11-28,除非注明,否则均为首码项目网原创文章,转载请注明出处。