#java #android #cryptography #aes #rsa
Вопрос:
У меня был этот код на python
Шифрование RSA
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64
def rsa_encrypt(pempubkey,plain_text):
rsaPublicKey = PKCS1_OAEP.new(RSA.importKey(pempubkey))
cipher_text = rsaPublicKey.encrypt(plain_text)
return base64.b64encode(cipher_text)
plain_text = "This is the RSA 2048bit key enctypted text"
pempubkey = open("publicKey.pem").read()
b64_cipher_text = rsa_encrypt(pempubkey,plain_text)
print "Cipher text (Base64 string):",b64_cipher_text
Шифрование AES
from Crypto.Cipher import AES,PKCS1_OAEP
from Crypto import Random
import base64
def pkcs7Padding(data):
length = 16 - (len(data) % 16)
data = chr(length)*length
return data
def aes_encrypt(plain_text,key,iv):
plain_text = pkcs7Padding(plain_text)
cipher = AES.new(key, AES.MODE_CBC, iv)
cipher_text = cipher.encrypt(plain_text)
b64_cipher_text = base64.b64encode(cipher_text)
return b64_cipher_text
key = Random.new().read(32);
iv = Random.new().read(AES.block_size)
data = "This string was AES-256 / CBC / PKCS Padding encrypted."
cipher_text = aes_encrypt(data,key,iv)
print cipher_text
Я пытаюсь реализовать то же самое в Java, как показано ниже
public class CryptoHandler {
private static final String RSA_PUBLIC_KEY = "this is the rsa public key";
private static final String TRANSFORMATION_AES = "AES/CBC/PKCS7Padding";
private static final String TRANSFORMATION_RSA = "RSA/None/OAEPPadding";
private static final String ALGORITHM_AES = "AES";
private static final String ALGORITHM_RSA = "RSA";
@Nullable
public static String encryptUsingAES(String 32charKey, String 16charIV, String data) {
try {
byte[] srcBuff = data.getBytes();
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), ALGORITHM_AES);
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance(TRANSFORMATION_AES);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
cipher.getBlockSize();
byte[] dstBuff = cipher.doFinal(srcBuff);
return Base64.toBase64String(dstBuff);
} catch (Exception exception) {
Logger.logException(exception);
}
return null;
}
@Nullable
public static String encryptUsingRSA(String data) {
try {
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decode(RSA_PUBLIC_KEY.getBytes()));
KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_RSA);
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);
Cipher cipher = Cipher.getInstance(TRANSFORMATION_RSA);
cipher.init(Cipher.ENCRYPT_MODE, rsaPublicKey);
byte[] result = cipher.doFinal(data.getBytes());
return Base64.toBase64String(result);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
Я пытаюсь запустить оба кода, но получаю разные результаты. Чего не хватает в моем java-коде?
Примечание: Я работаю на стороне клиента, поэтому у меня нет закрытого ключа, моя сторона заключается в шифровании данных и отправке на сервер для расшифровки
Комментарии:
1. Пожалуйста, отформатируйте код правильно и разумно.
2. @PresidentJamesK. Полк, я отформатировал код
3. @Topaco я отформатировал код и обнаружил, что RSA выдает другой вывод
4. @Topaco как я уже упоминал, у меня нет закрытого ключа, есть только открытый ключ. так что моя сторона не может его расшифровать
5. @Topaco У меня была отладка с моим парнем из ios. Быстрый
PH/fpV6rpm8PnLJPjRZ9FWyEOKerQrrAChPPgnIGznSJVgqKUA3TiUl5X2w0eKuA0p /AF0siGmdwgEl4YkKGJNKx0P02JMfsXm1neWRP fY6BPhDVnq0wogCWy/W1GPAaES 1C0gaOnXw 73PzgOY cD2UCvxeiAcT0p4 lpQD1Oduz7qIYqVgzZm5K4dmKfKTNMcL9uU7QNrkHIFD6N1GdcvRUVvsZVQlPUTxD11U7jE/0ZGO1xwIbQwNWznduyHLigPNy2 NOagufPNHBp/IcAfR6FKyemu/7HGU0LaGDrUhyxpc0IssNPqzVT8ksfU9RhADYWsLuXC28VU gl mUKOGKTW8fea2zaEdO2xs3FChD36e8CA6X4cuf9br1tIjj7Uk7CSjTwxFZfMf2A==