使用FishermanJCE生成的SM2私钥无法用在其他SM2解密算法上
时间: 2024-04-27 17:20:04 浏览: 160
这可能是因为FishermanJCE使用了特定的SM2密钥格式,而其他SM2解密算法可能使用不同的密钥格式。您可以尝试将FishermanJCE生成的私钥转换为其他SM2解密算法支持的密钥格式,或者使用FishermanJCE提供的SM2解密算法进行解密。如果您需要使用不同的SM2解密算法,请确保它们支持相同的密钥格式。
相关问题
前端传来一个SM2加密后的密码,后端用SM2私钥解密,java
实现如下:
1.首先,需要引入BouncyCastle库,这是一个密码学库,用于支持SM2算法。
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithRandom;
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.Security;
2.使用BouncyCastleProvider提供者进行初始化。
Security.addProvider(new BouncyCastleProvider());
3.获取SM2私钥和加密的密码。
String privateKeyStr = "私钥字符串";
String encryptedPassword = "加密后的密码字符串";
4.将私钥转化为ECPrivateKeyParameters类型。
byte[] privateKeyBytes = Base64.decode(privateKeyStr);
ECPrivateKeyParameters privateKey = (ECPrivateKeyParameters) PrivateKeyFactory.createKey(privateKeyBytes);
5.将加密的密码转化为byte数组。
byte[] encryptedPasswordBytes = Base64.decode(encryptedPassword);
6.使用SM2算法进行解密。
SM2Engine engine = new SM2Engine();
CipherParameters param = new ParametersWithRandom(privateKey);
engine.init(false, param);
byte[] decryptedPasswordBytes = engine.processBlock(encryptedPasswordBytes, 0, encryptedPasswordBytes.length);
7.将解密后的密码转化为字符串。
String decryptedPassword = new String(decryptedPasswordBytes);
完整代码实现:
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithRandom;
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.Security;
public class SM2Util {
public static void main(String[] args) {
Security.addProvider(new BouncyCastleProvider());
String privateKeyStr = "私钥字符串";
String encryptedPassword = "加密后的密码字符串";
try {
byte[] privateKeyBytes = Base64.decode(privateKeyStr);
ECPrivateKeyParameters privateKey = (ECPrivateKeyParameters) PrivateKeyFactory.createKey(privateKeyBytes);
byte[] encryptedPasswordBytes = Base64.decode(encryptedPassword);
SM2Engine engine = new SM2Engine();
CipherParameters param = new ParametersWithRandom(privateKey);
engine.init(false, param);
byte[] decryptedPasswordBytes = engine.processBlock(encryptedPasswordBytes, 0, encryptedPasswordBytes.length);
String decryptedPassword = new String(decryptedPasswordBytes);
System.out.println(decryptedPassword);
} catch (Exception e) {
e.printStackTrace();
}
}
}
SM2可以使用私钥加密、公钥解密吗
SM2(国密2)是一种非对称加密算法,它使用两个密钥:公钥和私钥。公钥用于加密,私钥用于解密。
因此,SM2可以使用私钥加密,公钥解密。
但是,一般来说,SM2更常用于使用公钥加密,私钥解密。这样可以保证信息的安全性,因为只有拥有私钥的人才能解密信息。
相关推荐















