首页 文章

Openssl rsa在java / android中解密

提问于
浏览
0

我想在java中解密在openssl中加密的文件 . 使用openssl使用私钥加密文件,在java端我希望使用公钥解密它 .

The code:

public void testRSA() throws InvalidKeySpecException, NoSuchAlgorithmException, IOException, IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchPaddingException {
    String rawPublicKey = new String(StreamUtils.loadBytes(getContext().getAssets().open("public.key")));
    Log.d(TAG, rawPublicKey);
    rawPublicKey = rawPublicKey.replace("-----BEGIN PUBLIC KEY-----\n", "");
    rawPublicKey = rawPublicKey.replace("-----END PUBLIC KEY-----", "");
    byte[] encoded = Base64.decode(rawPublicKey, 0);
    PublicKey publicKey = SignUtils.getAsPublicKey(encoded);

    byte[] encryptedFile = StreamUtils.loadBytes(getContext().getAssets().open("encrypted_file.bin"));
    String encryptedFileString = new String(encryptedFile);

    //STACK_NOTE: This file contains 3 parts but only first is used by this code.
    // encryptedFileParts[0] is equal to test_file from OpenSSL test
    String[] encryptedFileParts = encryptedFileString.split(";");
    Log.d(TAG, new String(encryptedFileParts[0].getBytes()));

    byte[] encryptedKey = Base64.decode(encryptedFileParts[0].getBytes(), 0);

    Log.d(TAG, new String(encryptedKey));

    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, publicKey);
    byte[] bytesPassword = cipher.doFinal(encryptedKey);

    String passwd = new String(bytesPassword, "UTF8");
    Log.d(TAG, "Recieved password = " + passwd);
    assertEquals("@rm@gEdon2014", passwd);
}

The error:

junit.framework.ComparisonFailure: expected:<[@rm@gEdon2014]>
but was:<[�����(...a lot of these...)��������@rm@gEdon2014
]>

OpenSSL test:

$ openssl enc -d -base64 -in test_file -out test_file_dec
$ openssl rsautl -verify -inkey public.key -in test_file_dec -pubin
@rm@gEdon2014

惊喜一切都好!

The files:

public.key

-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxOIG72RiGb73AOn0LtVm
WvD5IlyVnp6xBhn2Q0LreiQ4htmzPd8oSRhCxlYDIJLz9mfq10cSvV6+iKLeDQh5
EI06XcB8x2wSbqv5+rkCy8r6efcrjNq5SSTdDdzk2Pb6I952mgincwvwgeD7BNxx
SIvVWGnZwb4b8NetrRJ4IQqvj7lD96qJ/veMUduQ0S6VC17G28fNefRSr2O4v0GU
vPLFiliYUEzBmE3S9gIWcSiktACo+ddz8OChouxtANLqBxS6Lz1o8AAfcIweF0vm
ZbDpteYBNGCiuHgPDNB+7Hcf+8xjUfQkE2N35dkVobh6DmgRyFT9q7ZJQERkrnr4
fCzq53Z3kR4gp0taRqUTb2KdxJHLleW5tYAcKCs2OszOcsgz00oapl6ZbiJrxA5b
bQovpiCr7UJ3zCgs293vUXK5aa/ajU4hIiL1YXtdiX8XH5uwePvWMnX7mSww801z
rOko29etXhYgieAVepr/mGh64fZg5xHW2tEKhL+7Bo/yPmxsKMFNGQUdXST0GReA
dLs+LiecnEjuNeKYqRIrbOYC/BPXoJ6cNq/KJ46TyQ+a6zh2qVDPqYQe67Q5HJu2
47gILn1j1C/CbXa/CVapeOjqV/4gVh7LepIJMag9uMTazN1vlt7/ItEvb5n4QrAW
G0kh72xOkoHIeVe4/c3rJzECAwEAAQ==
-----END PUBLIC KEY-----

test_file

UFnXFnQmzefIwB0KkkGwcbAng/l4uM+8ecC5FFz2sPeVeha1vb/Wbbpd0W/BffSz
v2Luq0ItX3vogRzx94MNXo4Tz1CjA0CQhOkYL+y92/sW7jClfnxWH2IEs5mdl/we
SR60AdxD0H2RCeWDWZnOmgQQbRMOj0R0+j1ek5p8Mhj+Ew81g2aql8Nu/EGvqn+h
LYR6ZevlKmn5XW7a17om6RW9w0g04QfCTldxOH0IZOszVSfkadx6yvCpHxTi0WRv
8JJXVhilZxtTTDaVj38PJ7XUC6JoTcGNxVLi1G2okHTMFfsTFKUy+NNVSMEHM01t
dDvkWH9CZXXiZREMeu2kK/0D+GoQrsLmJ9O2L3lv/apN4qabqZ/NXpfA+jNE5Pfi
ckoUi1A2utmnM4H6HeL8Ap+QHcAr7G5NBjahxMF5X0YVmEtGhzMt3Dt+S3jhNfPS
tk5Ic6rqmgvipc6kG5ApTgwgRhn+ferEG+KQIG0hkAtP6yEoJw5unznld75Y/t7y
djdnb71HNPRVoxVc4aI96tAJSrqXHjmYMxpEWKKb1VTWxnn77vjdGdU7sqlipGCU
jc+k2csUICaJzg4CjGykTsRF8cDkUlAcN8ZPgdVJWGWghvrUgDurYMmic2aaqGvQ
zYxl1ErE8y92z0tQKXGYWMAHQvyB7Gpga1km1oDURdM=

The question:

这些 标志来自何处以及如何解决?

1 回答

  • 0

    我在Information security收到了答复 .

    这些 符号只是0x0字节 . 在使用密码之前,我需要从收到的密码字节中删除它们 .

    链接answer

相关问题