public class SignUtils {java
private static final String ALGORITHM = "RSA";android
private static final String SIGN_ALGORITHMS = "SHA1WithRSA";ide
private static final String DEFAULT_CHARSET = "UTF-8";spa
public static String sign(String content, String privateKey) {code
try {get
PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(it
Base64.decode(privateKey));io
KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);ast
PrivateKey priKey = keyf.generatePrivate(priPKCS8);class
java.security.Signature signature = java.security.Signature
.getInstance(SIGN_ALGORITHMS);
signature.initSign(priKey);
signature.update(content.getBytes(DEFAULT_CHARSET));
byte[] signed = signature.sign();
return Base64.encode(signed);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
第一開始,調用KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);報錯。以下:
java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
KeyFactory keyf = KeyFactory.getInstance(ALGORITHM, "BC"); 加入了「BC」報以下錯誤:
com.android.org.bouncycastle.jcajce.provider.asymmetric.util.ExtendedInvalidKeySpecException: unable to process key spec: java.lang.ClassCastException: com.android.org.bouncycastle.asn1.DLSequence cannot be cast to com.android.org.bouncycastle.asn1.ASN1Integer
最終由於傳入私鑰錯誤。須要從新生成私鑰:
私鑰的格式大約是這樣: