2017-03-14 3 views
0

자바 RSA 암호 해독 코드의 pice가 있는데, 지금은 파이썬 pycrypto로 표현하고 싶습니다. 하지만 동일한 개인 키를 사용하지만 다른 암호문을 사용하고 서버는 java로 암호화 된 암호문에만 액세스합니다.파이썬에서 RSA 패딩을 지정하는 방법 pycrypto

나는 구글을 구경한다, 그것은 패딩의 원인처럼 보인다.
RSA에 익숙하지 않습니다. 현재 해결책은 Tomcat에서 java 코드를 실행하고, Python은 http 요청을 통해 호출합니다.

하지만 여전히 파이썬 코드에서 직접 암호화하고 싶습니다. 파이썬 코드에서

public static String encrypt(String paramString)throws Exception 
{ 
    return Base64Utils.encode(RSAUtils.encryptByPrivateKey(paramString.getBytes(), "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIrrUGxh+yvNNI1c9hUg1rH+EtipI0nPk3zRm2Cj4mLDWLJ6DaTzdJTXTF3BYZaancWeG3QtBL+fITUi72InwBP7zaNG8uv/guwuhWT6V/YO7AaTrOFeTkg9NXuaFbn3hWVtZxQm2tIlaVa8snoNj3VGnPqIjXmGcxk4axuYd7sTAgMBAAECgYA43YhnRVh2nqJzd2k4Tt/zrmhyjhHm5fSetIKg9ZT3DrXhITsymYHQZ61X95AGATayLT1Zug/mjLIgOTO6f0ENkRQtjVCmKd8Yf/BeDEc5kRLUYDfSqoEydHK0+rCw5tJMgrAnQc5lHc+FVdGe2bOxKTEtZoss9VQ2jYuQ+Z5fUQJBANnvDOcI2OYSksX3PpHzO9F272xkmqYBRGkMc/a5RuOv1CY6FqMIkkloTf6nVl9y6XYV8gnHfbbI/wj4Q4UnPYsCQQCjLxyRYaOeEb/qOzSmFXytgMuCM9sr4eY9jpjzDgNWhpbtaVaf1QvSTXqN0zaUu4Se2tmWGX7zXw9p/dFf8DmZAkEAzl1o0FU2XhZ0WXVYEIhMunpvGSrirhNBHmAmZxjmoa/bqh8TVGpHa6+TO3JlfZioraL2QIBg8Ha/2VSNS0bvJQJALfCLaFpGh6+TicuVLNSLvwStRkB3CUmVWesVIAfn5KoLP1cSbfi6VUA+qkK18PVBhr8x1lHjLXyriDlOgmXMsQJAW9vD/IoBs4QJF87xF7tZvu/b1KRVgLM1edqOgVwMNbIQHBAXghjVjrpuln5w6z1dJ2cEjRP98OxKC0hqEIwIuQ==")); 
} 

public static byte[] encryptByPrivateKey(byte[] paramArrayOfByte, String paramString)throws Exception 
{ 
    paramString = new PKCS8EncodedKeySpec(Base64Utils.decode(paramString)); 
    paramString = KeyFactory.getInstance("RSA").generatePrivate(paramString); 
    Cipher localCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//like this padding 
    localCipher.init(1, paramString); 
    int k = paramArrayOfByte.length; 
    ByteArrayOutputStream localByteArrayOutputStream = new ByteArrayOutputStream(); 
    int j = 0; 
    int i = 0; 
    if (k - j > 0) 
    { 
     if (k - j > 117) {} 
     for (paramString = localCipher.doFinal(paramArrayOfByte, j, 117);; paramString = localCipher.doFinal(paramArrayOfByte, j, k - j)) 
     { 
     localByteArrayOutputStream.write(paramString, 0, paramString.length); 
     i += 1; 
     j = i * 117; 
     break; 
     } 
    } 
    paramArrayOfByte = localByteArrayOutputStream.toByteArray(); 
    localByteArrayOutputStream.close(); 
    return paramArrayOfByte; 
} 

: 자바 코드에서

같은 일반 텍스트에 대한

from Crypto.PublicKey import RSA 
from Crypto.Cipher import PKCS1_v1_5 
from base64 import b64decode, b64encode 

def encrypt(msg): 
    key = "MIICdgIBADANBgkqhkiG9w0BAQEFA..." 
    key = b64decode(key) 
    private_key = RSA.importKey(key) 
    cipher = PKCS1_v1_5.new(private_key) 
    return b64encode(cipher.encrypt(msg)) 

java.encrypt("159742081"): 
first time: GBn6RGIeEp8j/n35CgT5DdMmrvvNBtVCFQikO0vfJaYYrpEzBZ/F+5PkFLpzLDtYvQrj0Q/x/Fdxz3BtbEdLq57WFxB5MvkFxerWVeplA2vdlD7m+dgjsWyxBSbcVV1QX3UBNp+T3DtxL6uGuWUNxucy9yB5TOD3xCNchzGCnSU= 
second time: GBn6RGIeEp8j/n35CgT5DdMmrvvNBtVCFQikO0vfJaYYrpEzBZ/F+5PkFLpzLDtYvQrj0Q/x/Fdxz3BtbEdLq57WFxB5MvkFxerWVeplA2vdlD7m+dgjsWyxBSbcVV1QX3UBNp+T3DtxL6uGuWUNxucy9yB5TOD3xCNchzGCnSU= 

python.encrypt('159742081'): 
first time:K5VXCDAPZ5yg0/UFT6mLdDOlYAI0n15HR9I60ZMntyHIItUDK7mnb67oX5BzZpx+j6OH8nfeZFPPfxRKpk83m4uN7Gw0TZTuN0eajRa2Jg79ctumBqmzCQM/05UH3wCMouVbvFu31O4PLBHqcmJNuJCOiAJE98wMKIwdS7ewv/4 
second time:UWWdt1WcI0UOovXb7hH1CqK0RJWSJ4uVCOJ0wjtzPu8JB1cAOu+JaWDBjh6PMWWdi6Osb2cnOddYdgUHoMiTUieAIbj2jaXXxKzxaNlqDAGNRLZUthZXqMPEdpZ91Jagus9OS/soJBP/Vkz6i1lqpriDsm5CqVsSr+Bz+Ro7+Vo= 

그러나 python.encrypt, 같은 암호문을 반환 java.encrypt 매회 다른 암호문을 반환하십시오.

+0

공개 키를 사용하여 암호화를 수행하고 개인 키를 사용하여 암호 해독을 수행합니다. 서명을하려면 개인 키로 서명하고 공개 키로 서명을 확인하십시오. 그것이 당신이 이해해야 만하는 최소한의 것입니다. Java와 pycrypto는 모두 암호화와 디지털 서명을위한 클래스가 다릅니다. 적절한 수업을 이용하십시오. –

+0

pycrypto에서 개인 키를 사용하여 무언가를 암호화하려면 API가 유선 방식으로되어 있고 개인 키에서 공개 키를 추출 할 수 있기 때문에 실제로 공개 키로 암호화해야합니다. –

답변

0

Java 코드에서 수행하려고하는 것을 절대 얻지는 못했지만 올바르게 진행되지 않습니다.

PKCS # 1 v1.5 암호화 용 패딩은 1..255 범위의 임의 값으로 설정된 최소 8 바이트를 사용합니다. 이것은 모듈러 지수화 후의 결과가 0에서 N (모듈러스) 범위 내에서 완전히 랜덤하다는 것을 의미합니다. 따라서 암호화 할 때마다 Java 또는 Python을 사용하여 결과가 완전히 무작위이어야합니다. 이 암호는 IND_CPA 보안이 필요합니다. 그렇지 않으면 두 개의 동일한 평문을 구별 할 수 있습니다.

암호화를 테스트하는 좋은 방법 중 하나가 있습니다. 해독하여 동일한 이진 일반 텍스트가 있는지 확인하십시오. 이 크로스 플랫폼을 테스트 할 수 있어야합니다.