RSA 암호화 예외:java.security.InvalidKeyException: IOException: algid parse error, not a sequence, 처리 방법

2037 단어
1. 이상 정보
RSA 암호화를 진행할 때 예외를 보고합니다:algid parse error, not a sequence.구체적인 오류 정보는 다음과 같습니다.
Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
	at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217)
	at java.security.KeyFactory.generatePrivate(KeyFactory.java:372)
	at com.hashland.otc.common.util.coder.RSACoder.sign(RSACoder.java:42)
	at com.hashland.otc.common.util.coder.RSACoder.main(RSACoder.java:306)
Caused by: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
	at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:352)
	at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:357)
	at sun.security.rsa.RSAPrivateCrtKeyImpl.(RSAPrivateCrtKeyImpl.java:91)
	at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:75)
	at sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:316)
	at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:213)
	... 3 more

2. 원인 분석
이 이상이 발생한 것은 키의 형식이 정확하지 않기 때문입니다. 키는 Pkcs8 형식이 아닙니다.일부 게시물은 이 줄의 코드를 넣으면 변환할 수 있다고 생각하지만, 사실은 아니다. 이것은 하나의 대상을 구성하는 것이고 변환하는 조작이 없기 때문에 안 된다.
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);

3. 해결 방법은 두 가지가 있다
1. 개인 키를 Pkcs8 형식으로 변경
개인 키의 공급자가 수정할 수도 있고, 스스로 수정할 수도 있다.스스로 절차를 수정: Mac이나 linux 컴퓨터에서 열쇠 (private.pem) 가 있는 디렉터리에 들어가 다음 명령을 실행합니다.
openssl pkcs8 -topk8 -inform PEM -in private.key -outform pem -nocrypt -out pkcs8.pem  

이것은 같은 등급 디렉터리에서 Pkcs8 형식의 새로운 개인 키를 생성합니다: Pkcs8.pem.
Pkcs8을 Pkcs1로 바꾸려면 다음 명령을 사용할 수 있습니다.
openssl pkcs8 -in pkcs8.pem -nocrypt -out pri_key.pem

2. 호출 전 코드 추가
java.security.Security.addProvider(
    new org.bouncycastle.jce.provider.BouncyCastleProvider()
);

4. 총결산
개인적으로 개인 키 방식을 수정하는 것을 추천합니다. 어쨌든 이런 방식은 비교적 간단합니다.

좋은 웹페이지 즐겨찾기