change to KeyPair

This commit is contained in:
Looly 2024-08-14 01:07:34 +08:00
parent a38d7b47ab
commit ddde088695
14 changed files with 114 additions and 137 deletions

View File

@ -16,8 +16,6 @@
package org.dromara.hutool.crypto; package org.dromara.hutool.crypto;
import org.bouncycastle.crypto.BufferedBlockCipher;
import java.util.Arrays; import java.util.Arrays;
/** /**
@ -93,7 +91,6 @@ public interface Cipher {
final byte[] buf = new byte[getOutputSize(in.length)]; final byte[] buf = new byte[getOutputSize(in.length)];
int len = process(in, 0, in.length, buf, 0); int len = process(in, 0, in.length, buf, 0);
len += doFinal(buf, len); len += doFinal(buf, len);
if (len == buf.length) { if (len == buf.length) {
return buf; return buf;
} }

View File

@ -16,8 +16,7 @@
package org.dromara.hutool.crypto.asymmetric; package org.dromara.hutool.crypto.asymmetric;
import java.security.PrivateKey; import java.security.KeyPair;
import java.security.PublicKey;
/** /**
* 抽象的非对称加密对象包装了加密和解密为Hex和Base64的封装 * 抽象的非对称加密对象包装了加密和解密为Hex和Base64的封装
@ -38,12 +37,10 @@ public abstract class AbstractAsymmetricCrypto<T extends AbstractAsymmetricCrypt
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密
* *
* @param algorithm 算法 * @param algorithm 算法
* @param privateKey 私钥 * @param keyPair 密钥对如果为{@code null}则生成随机的私钥和公钥
* @param publicKey 公钥
* @since 3.1.1
*/ */
public AbstractAsymmetricCrypto(final String algorithm, final PrivateKey privateKey, final PublicKey publicKey) { public AbstractAsymmetricCrypto(final String algorithm, final KeyPair keyPair) {
super(algorithm, privateKey, publicKey); super(algorithm, keyPair);
} }
// ------------------------------------------------------------------ Constructor end // ------------------------------------------------------------------ Constructor end
} }

View File

@ -25,10 +25,7 @@ import javax.crypto.BadPaddingException;
import javax.crypto.Cipher; import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException; import javax.crypto.IllegalBlockSizeException;
import java.io.IOException; import java.io.IOException;
import java.security.Key; import java.security.*;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec; import java.security.spec.AlgorithmParameterSpec;
/** /**
@ -124,7 +121,7 @@ public class AsymmetricCrypto extends AbstractAsymmetricCrypto<AsymmetricCrypto>
* @since 3.1.1 * @since 3.1.1
*/ */
public AsymmetricCrypto(final AsymmetricAlgorithm algorithm, final PrivateKey privateKey, final PublicKey publicKey) { public AsymmetricCrypto(final AsymmetricAlgorithm algorithm, final PrivateKey privateKey, final PublicKey publicKey) {
this(algorithm.getValue(), privateKey, publicKey); this(algorithm.getValue(), new KeyPair(publicKey, privateKey));
} }
/** /**
@ -151,9 +148,10 @@ public class AsymmetricCrypto extends AbstractAsymmetricCrypto<AsymmetricCrypto>
*/ */
public AsymmetricCrypto(final String algorithm, final byte[] privateKey, final byte[] publicKey) { public AsymmetricCrypto(final String algorithm, final byte[] privateKey, final byte[] publicKey) {
this(algorithm, // this(algorithm, //
KeyUtil.generatePrivateKey(algorithm, privateKey), // new KeyPair(
KeyUtil.generatePublicKey(algorithm, publicKey)// KeyUtil.generatePublicKey(algorithm, publicKey),
); KeyUtil.generatePrivateKey(algorithm, privateKey)
));
} }
/** /**
@ -162,13 +160,11 @@ public class AsymmetricCrypto extends AbstractAsymmetricCrypto<AsymmetricCrypto>
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br> * 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密
* *
* @param algorithm 算法 * @param algorithm 算法
* @param privateKey 私钥 * @param keyPair 密钥对包含私钥和公钥如果为{@code null}则生成随机键值对
* @param publicKey 公钥
* @since 3.1.1
*/ */
public AsymmetricCrypto(final String algorithm, final PrivateKey privateKey, final PublicKey publicKey) { public AsymmetricCrypto(final String algorithm, final KeyPair keyPair) {
super(algorithm, privateKey, publicKey); super(algorithm, keyPair);
} }
// ------------------------------------------------------------------ Constructor end // ------------------------------------------------------------------ Constructor end
@ -244,8 +240,8 @@ public class AsymmetricCrypto extends AbstractAsymmetricCrypto<AsymmetricCrypto>
} }
@Override @Override
public AsymmetricCrypto init(final String algorithm, final PrivateKey privateKey, final PublicKey publicKey) { public AsymmetricCrypto init(final String algorithm, final KeyPair keyPair) {
super.init(algorithm, privateKey, publicKey); super.init(algorithm, keyPair);
initCipher(); initCipher();
return this; return this;
} }
@ -332,12 +328,9 @@ public class AsymmetricCrypto extends AbstractAsymmetricCrypto<AsymmetricCrypto>
* @throws IOException IO异常不会被触发 * @throws IOException IO异常不会被触发
*/ */
private byte[] doFinal(final byte[] data, final int maxBlockSize) throws IllegalBlockSizeException, BadPaddingException, IOException { private byte[] doFinal(final byte[] data, final int maxBlockSize) throws IllegalBlockSizeException, BadPaddingException, IOException {
// 模长
final int dataLength = data.length;
// 不足分段 // 不足分段
if (dataLength <= maxBlockSize) { if (data.length <= maxBlockSize) {
return getCipher().doFinal(data, 0, dataLength); return getCipher().doFinal(data, 0, data.length);
} }
// 分段解密 // 分段解密
@ -350,9 +343,6 @@ public class AsymmetricCrypto extends AbstractAsymmetricCrypto<AsymmetricCrypto>
* @param data 数据 * @param data 数据
* @param maxBlockSize 最大分段的段大小不能为小于1 * @param maxBlockSize 最大分段的段大小不能为小于1
* @return 加密或解密后的数据 * @return 加密或解密后的数据
* @throws IllegalBlockSizeException 分段异常
* @throws BadPaddingException padding错误异常
* @throws IOException IO异常不会被触发
*/ */
@SuppressWarnings("resource") @SuppressWarnings("resource")
private byte[] doFinalWithBlock(final byte[] data, final int maxBlockSize) throws IllegalBlockSizeException, BadPaddingException, IOException { private byte[] doFinalWithBlock(final byte[] data, final int maxBlockSize) throws IllegalBlockSizeException, BadPaddingException, IOException {

View File

@ -18,6 +18,7 @@ package org.dromara.hutool.crypto.asymmetric;
import org.dromara.hutool.core.codec.binary.Base64; import org.dromara.hutool.core.codec.binary.Base64;
import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.lang.Assert;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.crypto.CryptoException; import org.dromara.hutool.crypto.CryptoException;
import org.dromara.hutool.crypto.KeyUtil; import org.dromara.hutool.crypto.KeyUtil;
@ -43,6 +44,10 @@ public class BaseAsymmetric<T extends BaseAsymmetric<T>> implements Serializable
* 算法 * 算法
*/ */
protected String algorithm; protected String algorithm;
/**
*
*/
protected Lock lock = new ReentrantLock();
/** /**
* 公钥 * 公钥
*/ */
@ -51,11 +56,6 @@ public class BaseAsymmetric<T extends BaseAsymmetric<T>> implements Serializable
* 私钥 * 私钥
*/ */
protected PrivateKey privateKey; protected PrivateKey privateKey;
/**
*
*/
protected final Lock lock = new ReentrantLock();
// ------------------------------------------------------------------ Constructor start // ------------------------------------------------------------------ Constructor start
/** /**
@ -64,13 +64,12 @@ public class BaseAsymmetric<T extends BaseAsymmetric<T>> implements Serializable
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br> * 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密
* *
* @param algorithm 算法 * @param algorithm 算法
* @param privateKey 私钥 * @param keyPair 密钥对包括私钥和公钥
* @param publicKey 公钥 * @since 6.0.0
* @since 3.1.1
*/ */
public BaseAsymmetric(final String algorithm, final PrivateKey privateKey, final PublicKey publicKey) { public BaseAsymmetric(final String algorithm, final KeyPair keyPair) {
init(algorithm, privateKey, publicKey); init(algorithm, keyPair);
} }
// ------------------------------------------------------------------ Constructor end // ------------------------------------------------------------------ Constructor end
@ -79,15 +78,16 @@ public class BaseAsymmetric<T extends BaseAsymmetric<T>> implements Serializable
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br> * 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密签名或者解密校验 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密签名或者解密校验
* *
* @param algorithm 算法 * @param algorithm 算法
* @param privateKey 私钥 * @param keyPair 密钥对包括私钥和公钥
* @param publicKey 公钥
* @return this * @return this
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
protected T init(final String algorithm, final PrivateKey privateKey, final PublicKey publicKey) { protected T init(final String algorithm, final KeyPair keyPair) {
this.algorithm = algorithm; this.algorithm = algorithm;
final PrivateKey privateKey = ObjUtil.apply(keyPair, KeyPair::getPrivate);
final PublicKey publicKey = ObjUtil.apply(keyPair, KeyPair::getPublic);
if (null == privateKey && null == publicKey) { if (null == privateKey && null == publicKey) {
initKeys(); initKeys();
} else { } else {
@ -102,7 +102,7 @@ public class BaseAsymmetric<T extends BaseAsymmetric<T>> implements Serializable
} }
/** /**
* 生成公钥和私钥 * 生成随机公钥和私钥
* *
* @return this * @return this
*/ */
@ -114,7 +114,20 @@ public class BaseAsymmetric<T extends BaseAsymmetric<T>> implements Serializable
return (T) this; return (T) this;
} }
// --------------------------------------------------------------------------------- Getters and Setters /**
* 自定义锁无需锁使用{@link org.dromara.hutool.core.thread.lock.NoLock}
*
* @param lock 自定义锁
* @return this
* @since 6.0.0
*/
@SuppressWarnings("unchecked")
public T setLock(final Lock lock) {
this.lock = lock;
return (T) this;
}
// region ----- getOrSetKeys
/** /**
* 获得公钥 * 获得公钥
@ -217,4 +230,5 @@ public class BaseAsymmetric<T extends BaseAsymmetric<T>> implements Serializable
} }
throw new CryptoException("Unsupported key type: " + type); throw new CryptoException("Unsupported key type: " + type);
} }
// endregion
} }

View File

@ -16,8 +16,7 @@
package org.dromara.hutool.crypto.asymmetric; package org.dromara.hutool.crypto.asymmetric;
import java.security.PrivateKey; import java.security.KeyPair;
import java.security.PublicKey;
/** /**
* ECIES集成加密方案elliptic curve integrate encrypt scheme * ECIES集成加密方案elliptic curve integrate encrypt scheme
@ -95,12 +94,10 @@ public class ECIES extends AsymmetricCrypto{
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br> * 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密
* *
* @param privateKey 私钥 * @param keyPair 密钥对{@code null}表示随机生成
* @param publicKey 公钥
* @since 3.1.1
*/ */
public ECIES(final PrivateKey privateKey, final PublicKey publicKey) { public ECIES(final KeyPair keyPair) {
super(ALGORITHM_ECIES, privateKey, publicKey); super(ALGORITHM_ECIES, keyPair);
} }
/** /**
@ -109,12 +106,10 @@ public class ECIES extends AsymmetricCrypto{
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密
* *
* @param eciesAlgorithm 自定义ECIES算法例如ECIESwithDESede/NONE/PKCS7Padding * @param eciesAlgorithm 自定义ECIES算法例如ECIESwithDESede/NONE/PKCS7Padding
* @param privateKey 私钥 * @param keyPair 密钥对{@code null}表示随机生成
* @param publicKey 公钥
* @since 4.5.8
*/ */
public ECIES(final String eciesAlgorithm, final PrivateKey privateKey, final PublicKey publicKey) { public ECIES(final String eciesAlgorithm, final KeyPair keyPair) {
super(eciesAlgorithm, privateKey, publicKey); super(eciesAlgorithm, keyPair);
} }
// ------------------------------------------------------------------ Constructor end // ------------------------------------------------------------------ Constructor end
} }

View File

@ -21,6 +21,7 @@ import org.dromara.hutool.crypto.provider.GlobalProviderFactory;
import org.dromara.hutool.crypto.KeyUtil; import org.dromara.hutool.crypto.KeyUtil;
import java.math.BigInteger; import java.math.BigInteger;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.PublicKey; import java.security.PublicKey;
@ -161,12 +162,10 @@ public class RSA extends AsymmetricCrypto {
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密
* *
* @param rsaAlgorithm 自定义RSA算法例如RSA/ECB/PKCS1Padding * @param rsaAlgorithm 自定义RSA算法例如RSA/ECB/PKCS1Padding
* @param privateKey 私钥 * @param keyPair 密钥对{@code null}表示随机生成
* @param publicKey 公钥
* @since 4.5.8
*/ */
public RSA(final String rsaAlgorithm, final PrivateKey privateKey, final PublicKey publicKey) { public RSA(final String rsaAlgorithm, final KeyPair keyPair) {
super(rsaAlgorithm, privateKey, publicKey); super(rsaAlgorithm, keyPair);
} }
// ------------------------------------------------------------------ Constructor end // ------------------------------------------------------------------ Constructor end

View File

@ -168,7 +168,7 @@ public class SM2 extends AbstractAsymmetricCrypto<SM2> {
* @param publicKeyParams 公钥可以为null * @param publicKeyParams 公钥可以为null
*/ */
public SM2(final ECPrivateKeyParameters privateKeyParams, final ECPublicKeyParameters publicKeyParams) { public SM2(final ECPrivateKeyParameters privateKeyParams, final ECPublicKeyParameters publicKeyParams) {
super(ALGORITHM_SM2, null, null); super(ALGORITHM_SM2, null);
this.privateKeyParams = privateKeyParams; this.privateKeyParams = privateKeyParams;
this.publicKeyParams = publicKeyParams; this.publicKeyParams = publicKeyParams;
this.init(); this.init();

View File

@ -45,10 +45,13 @@ import java.util.Set;
public class Sign extends BaseAsymmetric<Sign> { public class Sign extends BaseAsymmetric<Sign> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** 签名,用于签名和验证 */ /**
* 签名用于签名和验证
*/
protected Signature signature; protected Signature signature;
// ------------------------------------------------------------------ Constructor start // ------------------------------------------------------------------ Constructor start
/** /**
* 构造创建新的私钥公钥对 * 构造创建新的私钥公钥对
* *
@ -71,9 +74,9 @@ public class Sign extends BaseAsymmetric<Sign> {
* 构造 私钥和公钥同时为空时生成一对新的私钥和公钥<br> * 构造 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证
* *
* @param algorithm {@link SignAlgorithm} * @param algorithm {@link SignAlgorithm}
* @param privateKeyStr 私钥Hex或Base64表示 * @param privateKeyStr 私钥Hex或Base64表示
* @param publicKeyStr 公钥Hex或Base64表示 * @param publicKeyStr 公钥Hex或Base64表示
*/ */
public Sign(final SignAlgorithm algorithm, final String privateKeyStr, final String publicKeyStr) { public Sign(final SignAlgorithm algorithm, final String privateKeyStr, final String publicKeyStr) {
this(algorithm.getValue(), SecureUtil.decode(privateKeyStr), SecureUtil.decode(publicKeyStr)); this(algorithm.getValue(), SecureUtil.decode(privateKeyStr), SecureUtil.decode(publicKeyStr));
@ -83,9 +86,9 @@ public class Sign extends BaseAsymmetric<Sign> {
* 构造 私钥和公钥同时为空时生成一对新的私钥和公钥<br> * 构造 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证
* *
* @param algorithm {@link SignAlgorithm} * @param algorithm {@link SignAlgorithm}
* @param privateKey 私钥 * @param privateKey 私钥
* @param publicKey 公钥 * @param publicKey 公钥
*/ */
public Sign(final SignAlgorithm algorithm, final byte[] privateKey, final byte[] publicKey) { public Sign(final SignAlgorithm algorithm, final byte[] privateKey, final byte[] publicKey) {
this(algorithm.getValue(), privateKey, publicKey); this(algorithm.getValue(), privateKey, publicKey);
@ -96,7 +99,7 @@ public class Sign extends BaseAsymmetric<Sign> {
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证
* *
* @param algorithm {@link SignAlgorithm} * @param algorithm {@link SignAlgorithm}
* @param keyPair 密钥对包括公钥和私钥 * @param keyPair 密钥对{@code null}表示随机生成
*/ */
public Sign(final SignAlgorithm algorithm, final KeyPair keyPair) { public Sign(final SignAlgorithm algorithm, final KeyPair keyPair) {
this(algorithm.getValue(), keyPair); this(algorithm.getValue(), keyPair);
@ -106,21 +109,9 @@ public class Sign extends BaseAsymmetric<Sign> {
* 构造 私钥和公钥同时为空时生成一对新的私钥和公钥<br> * 构造 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证
* *
* @param algorithm {@link SignAlgorithm} * @param algorithm 非对称加密算法
* @param privateKey 私钥
* @param publicKey 公钥
*/
public Sign(final SignAlgorithm algorithm, final PrivateKey privateKey, final PublicKey publicKey) {
this(algorithm.getValue(), privateKey, publicKey);
}
/**
* 构造 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证
*
* @param algorithm 非对称加密算法
* @param privateKeyBase64 私钥Base64 * @param privateKeyBase64 私钥Base64
* @param publicKeyBase64 公钥Base64 * @param publicKeyBase64 公钥Base64
*/ */
public Sign(final String algorithm, final String privateKeyBase64, final String publicKeyBase64) { public Sign(final String algorithm, final String privateKeyBase64, final String publicKeyBase64) {
this(algorithm, Base64.decode(privateKeyBase64), Base64.decode(publicKeyBase64)); this(algorithm, Base64.decode(privateKeyBase64), Base64.decode(publicKeyBase64));
@ -132,26 +123,16 @@ public class Sign extends BaseAsymmetric<Sign> {
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br> * 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证
* *
* @param algorithm 算法 * @param algorithm 算法
* @param privateKey 私钥 * @param privateKey 私钥
* @param publicKey 公钥 * @param publicKey 公钥
*/ */
public Sign(final String algorithm, final byte[] privateKey, final byte[] publicKey) { public Sign(final String algorithm, final byte[] privateKey, final byte[] publicKey) {
this(algorithm, // this(algorithm,
KeyUtil.generatePrivateKey(algorithm, privateKey), // new KeyPair(
KeyUtil.generatePublicKey(algorithm, publicKey)// KeyUtil.generatePublicKey(algorithm, publicKey),
); KeyUtil.generatePrivateKey(algorithm, privateKey)
} ));
/**
* 构造 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证
*
* @param algorithm 算法{@link SignAlgorithm}
* @param keyPair 密钥对包括公钥和私钥
*/
public Sign(final String algorithm, final KeyPair keyPair) {
this(algorithm, keyPair.getPrivate(), keyPair.getPublic());
} }
/** /**
@ -161,26 +142,24 @@ public class Sign extends BaseAsymmetric<Sign> {
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做签名或验证
* *
* @param algorithm 算法 * @param algorithm 算法
* @param privateKey 私钥 * @param keyPair 密钥对{@code null}表示随机生成
* @param publicKey 公钥
*/ */
public Sign(final String algorithm, final PrivateKey privateKey, final PublicKey publicKey) { public Sign(final String algorithm, final KeyPair keyPair) {
super(algorithm, privateKey, publicKey); super(algorithm, keyPair);
} }
// ------------------------------------------------------------------ Constructor end // ------------------------------------------------------------------ Constructor end
/** /**
* 初始化 * 初始化
* *
* @param algorithm 算法 * @param algorithm 算法
* @param privateKey 私钥 * @param keyPair 密钥对{@code null}表示随机生成
* @param publicKey 公钥
* @return this * @return this
*/ */
@Override @Override
public Sign init(final String algorithm, final PrivateKey privateKey, final PublicKey publicKey) { public Sign init(final String algorithm, final KeyPair keyPair) {
signature = SignUtil.createSignature(algorithm); signature = SignUtil.createSignature(algorithm);
super.init(algorithm, privateKey, publicKey); super.init(algorithm, keyPair);
return this; return this;
} }
@ -201,10 +180,11 @@ public class Sign extends BaseAsymmetric<Sign> {
} }
// --------------------------------------------------------------------------------- Sign and Verify // --------------------------------------------------------------------------------- Sign and Verify
/** /**
* 生成文件签名 * 生成文件签名
* *
* @param data 被签名数据 * @param data 被签名数据
* @param charset 编码 * @param charset 编码
* @return 签名 * @return 签名
* @since 5.7.0 * @since 5.7.0
@ -227,7 +207,7 @@ public class Sign extends BaseAsymmetric<Sign> {
/** /**
* 生成文件签名并转为16进制字符串 * 生成文件签名并转为16进制字符串
* *
* @param data 被签名数据 * @param data 被签名数据
* @param charset 编码 * @param charset 编码
* @return 签名 * @return 签名
* @since 5.7.0 * @since 5.7.0
@ -295,7 +275,7 @@ public class Sign extends BaseAsymmetric<Sign> {
* 生成签名并转为16进制字符串<br> * 生成签名并转为16进制字符串<br>
* 使用默认缓存大小 {@link IoUtil#DEFAULT_BUFFER_SIZE} * 使用默认缓存大小 {@link IoUtil#DEFAULT_BUFFER_SIZE}
* *
* @param data 被签名数据 * @param data 被签名数据
* @param bufferLength 缓存长度不足1使用 {@link IoUtil#DEFAULT_BUFFER_SIZE} 做为默认值 * @param bufferLength 缓存长度不足1使用 {@link IoUtil#DEFAULT_BUFFER_SIZE} 做为默认值
* @return 签名 * @return 签名
* @since 5.7.0 * @since 5.7.0
@ -307,12 +287,12 @@ public class Sign extends BaseAsymmetric<Sign> {
/** /**
* 生成签名 * 生成签名
* *
* @param data {@link InputStream} 数据流 * @param data {@link InputStream} 数据流
* @param bufferLength 缓存长度不足1使用 {@link IoUtil#DEFAULT_BUFFER_SIZE} 做为默认值 * @param bufferLength 缓存长度不足1使用 {@link IoUtil#DEFAULT_BUFFER_SIZE} 做为默认值
* @return 签名bytes * @return 签名bytes
* @since 5.7.0 * @since 5.7.0
*/ */
public byte[] sign(final InputStream data, int bufferLength){ public byte[] sign(final InputStream data, int bufferLength) {
if (bufferLength < 1) { if (bufferLength < 1) {
bufferLength = IoUtil.DEFAULT_BUFFER_SIZE; bufferLength = IoUtil.DEFAULT_BUFFER_SIZE;
} }

View File

@ -60,23 +60,10 @@ public class PaillierCrypto extends AbstractAsymmetricCrypto<PaillierCrypto> {
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br> * 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密 * 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密
* *
* @param keyPair 密钥对 * @param keyPair 密钥对{@code null}表示随机生成
*/ */
public PaillierCrypto(final KeyPair keyPair) { public PaillierCrypto(final KeyPair keyPair) {
this(keyPair.getPrivate(), keyPair.getPublic()); super(PaillierKey.ALGORITHM_NAME, keyPair);
}
/**
* 构造
* <p>
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个如此则只能使用此钥匙来做加密或者解密
*
* @param privateKey 私钥
* @param publicKey 公钥
*/
public PaillierCrypto(final PrivateKey privateKey, final PublicKey publicKey) {
super(PaillierKey.ALGORITHM_NAME, privateKey, publicKey);
this.spi = new PaillierCipherSpiImpl(); this.spi = new PaillierCipherSpiImpl();
} }

View File

@ -21,6 +21,7 @@ import org.dromara.hutool.crypto.bc.PemUtil;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.security.KeyPair;
import java.security.PublicKey; import java.security.PublicKey;
public class SignUtilTest { public class SignUtilTest {
@ -68,6 +69,6 @@ public class SignUtilTest {
"-----END CERTIFICATE-----"; "-----END CERTIFICATE-----";
final PublicKey key = (PublicKey) PemUtil.readPemKey(IoUtil.toUtf8Stream(publicKey)); final PublicKey key = (PublicKey) PemUtil.readPemKey(IoUtil.toUtf8Stream(publicKey));
new Sign(SignAlgorithm.SHA256withRSA, null, key); new Sign(SignAlgorithm.SHA256withRSA, new KeyPair(key, null));
} }
} }

View File

@ -186,7 +186,7 @@ public class RSATest {
+ "wfMhrJksfeKbIaMjNLS9b8JynIaXg9iCiyOHmgkMl5gAbPoH/ULXqSKwzBw5mJ2GW1gBlyaSfV3AkA/RJC+adIjsRGg"// + "wfMhrJksfeKbIaMjNLS9b8JynIaXg9iCiyOHmgkMl5gAbPoH/ULXqSKwzBw5mJ2GW1gBlyaSfV3AkA/RJC+adIjsRGg"//
+ "JOkiRjSmPpGv3FOhl9fsBPjupZBEIuoMWOC8GXK/73DHxwmfNmN7C9+sIi4RBcjEeQ5F5FHZ"; + "JOkiRjSmPpGv3FOhl9fsBPjupZBEIuoMWOC8GXK/73DHxwmfNmN7C9+sIi4RBcjEeQ5F5FHZ";
final RSA rsa = new RSA(PRIVATE_KEY, null); final RSA rsa = new RSA(PRIVATE_KEY, (String) null);
final String a = "2707F9FD4288CEF302C972058712F24A5F3EC62C5A14AD2FC59DAB93503AA0FA17113A020EE4EA35EB53F" // final String a = "2707F9FD4288CEF302C972058712F24A5F3EC62C5A14AD2FC59DAB93503AA0FA17113A020EE4EA35EB53F" //
+ "75F36564BA1DABAA20F3B90FD39315C30E68FE8A1803B36C29029B23EB612C06ACF3A34BE815074F5EB5AA3A"// + "75F36564BA1DABAA20F3B90FD39315C30E68FE8A1803B36C29029B23EB612C06ACF3A34BE815074F5EB5AA3A"//

View File

@ -1008,6 +1008,14 @@ public class ExcelWriter extends ExcelBase<ExcelWriter, ExcelWriteConfig> {
} }
// endregion // endregion
// region ----- fill
public ExcelWriter fillRow(final Map<?, ?> rowMap){
return this;
}
// endregion
// region ----- writeCol // region ----- writeCol
/** /**

View File

@ -99,4 +99,11 @@ public class TemplateContext {
} }
}); });
} }
@Override
public String toString() {
return "TemplateContext{" +
"varMap=" + varMap +
'}';
}
} }

View File

@ -12,6 +12,7 @@
package org.dromara.hutool.poi.excel.writer; package org.dromara.hutool.poi.excel.writer;
import org.dromara.hutool.core.lang.Console;
import org.dromara.hutool.poi.excel.ExcelUtil; import org.dromara.hutool.poi.excel.ExcelUtil;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -20,5 +21,6 @@ public class TemplateContextTest {
void readTemplate() { void readTemplate() {
final ExcelWriter writer = ExcelUtil.getWriter("d:/test/template.xlsx"); final ExcelWriter writer = ExcelUtil.getWriter("d:/test/template.xlsx");
final TemplateContext templateContext = new TemplateContext(writer.getSheet()); final TemplateContext templateContext = new TemplateContext(writer.getSheet());
Console.log(templateContext);
} }
} }