国密一般用到的加密套件是哪些
时间: 2024-04-03 16:35:49 浏览: 278
国密算法是中国自主研发的一种加密算法,与国际上通行的加密算法不同,因此使用的加密套件也与国际上不同。以下是一些常用的国密加密套件:
- ECDHE-ECDSA-AES256-GCM-SM4
- ECDHE-ECDSA-AES128-GCM-SM4
- ECDHE-ECDSA-AES256-SHA384
- ECDHE-ECDSA-AES128-SHA256
其中,ECDHE-ECDSA代表使用椭圆曲线数字签名算法来进行身份验证和密钥交换,AES256/AES128代表使用AES加密算法,GCM/SHA384/SHA256代表使用GCM或SHA算法进行消息认证。SM4代表使用国密算法进行加密。
需要注意的是,国密算法的加密强度与国际上的加密算法不完全一致,因此在选择国密加密套件时需要根据实际需求和安全要求进行权衡。
相关问题
国密非对称加密java
国密非对称加密是指采用国产密码算法进行非对称加密的一种方式。Java是一种广泛使用的编程语言,它具有强大的跨平台特性和丰富的加密库。
国密非对称加密在Java中的实现主要依赖于Bouncy Castle密码库。Bouncy Castle是一个开源的密码学库,它提供了一套丰富的密码算法和密码服务,包括国密算法。
使用国密非对称加密实现加密和解密的过程如下:
首先,需要生成一对公私钥。可以使用Java的密钥生成器(KeyPairGenerator)和密钥对(KeyPair)类来生成RSA密钥对或SM2密钥对。例如,通过指定算法为"RSA"或"SM2"来生成对应的密钥对对象。
然后,使用生成的公钥对数据进行加密。使用公钥加密器(Cipher)来实现加密操作,通过调用其doFinal()方法对明文进行加密,返回密文文本。
接下来,使用私钥对密文进行解密。同样,使用私钥解密器(Cipher)来实现解密操作,通过调用其doFinal()方法对密文进行解密,返回明文文本。
需要注意的是,国密非对称加密算法中,密钥长度可以根据需求进行指定,一般建议选择合适的安全强度。
总而言之,国密非对称加密在Java中的实现需要借助Bouncy Castle密码库,通过生成公私钥对、使用公钥进行加密、使用私钥进行解密来实现加密和解密的功能。
java国密数字信封加密
Java 中提供了 Bouncy Castle 库来支持国密算法(SM2,SM3,SM4),下面是使用 Bouncy Castle 库进行国密数字信封加密的示例代码:
```java
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.engines.SM4Engine;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.params.SM2EncryptedKeyParameters;
import org.bouncycastle.crypto.params.SM2KeyExchangePrivateParameters;
import org.bouncycastle.crypto.params.SM2KeyExchangePublicParameters;
import org.bouncycastle.crypto.util.PrivateKeyFactory;
import org.bouncycastle.crypto.util.PublicKeyFactory;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Security;
import java.util.Arrays;
public class SM2EnvelopeEncryptionDemo {
// 加密算法的名称
private static final String ENCRYPTION_ALGORITHM_NAME = "SM2";
// 对称加密算法的名称
private static final String SYMMETRIC_ENCRYPTION_ALGORITHM_NAME = "SM4/ECB/PKCS7Padding";
// 对称加密算法的密钥长度
private static final int SYMMETRIC_ENCRYPTION_KEY_SIZE = 128;
public static void main(String[] args) throws Exception {
Security.addProvider(new BouncyCastleProvider());
// 生成 SM2 密钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ENCRYPTION_ALGORITHM_NAME, "BC");
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 获取公钥和私钥
AsymmetricKeyParameter publicKey = PublicKeyFactory.createKey(keyPair.getPublic().getEncoded());
AsymmetricKeyParameter privateKey = PrivateKeyFactory.createKey(keyPair.getPrivate().getEncoded());
// 生成对称加密算法的密钥
byte[] symmetricKey = new byte[SYMMETRIC_ENCRYPTION_KEY_SIZE / 8];
SecureRandom random = new SecureRandom();
random.nextBytes(symmetricKey);
// 构造数字信封
SM2KeyExchangePublicParameters senderPublicKeyParams = new SM2KeyExchangePublicParameters(publicKey);
SM2KeyExchangePrivateParameters receiverPrivateKeyParams = new SM2KeyExchangePrivateParameters(privateKey);
SM2KeyExchangePublicParameters receiverPublicKeyParams = senderPublicKeyParams;
SM2KeyExchangePrivateParameters senderPrivateKeyParams = receiverPrivateKeyParams;
SM2KeyExchange.SM2KeyExchangeResult keyExchangeResult = SM2KeyExchange.computeKeyExchange(senderPrivateKeyParams, senderPublicKeyParams, receiverPrivateKeyParams, receiverPublicKeyParams);
SM2EncryptedKeyParameters encryptedKeyParams = new SM2EncryptedKeyParameters(keyExchangeResult.encryptedKey, keyExchangeResult.ephemeralPublicKey);
// 加密数据
SM4Engine sm4Engine = new SM4Engine();
sm4Engine.init(true, new KeyParameter(symmetricKey));
byte[] encryptedData = new byte[sm4Engine.getOutputSize(plainText.length)];
int outputLen = sm4Engine.processBytes(plainText, 0, plainText.length, encryptedData, 0);
outputLen += sm4Engine.doFinal(encryptedData, outputLen);
// 拼接密文
byte[] encryptedKey = encryptedKeyParams.getEncryptedKey();
byte[] iv = encryptedKeyParams.getIv();
byte[] cipherText = encryptedData;
byte[] encryptedMessage = new byte[encryptedKey.length + iv.length + cipherText.length];
System.arraycopy(encryptedKey, 0, encryptedMessage, 0, encryptedKey.length);
System.arraycopy(iv, 0, encryptedMessage, encryptedKey.length, iv.length);
System.arraycopy(cipherText, 0, encryptedMessage, encryptedKey.length + iv.length, cipherText.length);
// 输出结果
System.out.println("Symmetric Key (Base64): " + Base64.toBase64String(symmetricKey));
System.out.println("Encrypted Message (Base64): " + Base64.toBase64String(encryptedMessage));
}
}
```
在这个示例代码中,首先使用 Bouncy Castle 库生成了一个 SM2 密钥对,然后生成了对称加密算法(SM4)的密钥,接着构造了数字信封并进行了加密,最后输出了加密后的结果。
需要注意的是,如果要使用 SM2 算法进行数字信封加密,必须使用 SM2 密钥交换算法来加密对称加密算法的密钥,然后再使用对称加密算法加密数据。
阅读全文