parent
460d2856ea
commit
8261c7af25
@ -1,100 +0,0 @@ |
|||||||
package com.android.base.utils.security; |
|
||||||
|
|
||||||
import android.os.Build; |
|
||||||
import android.util.Base64; |
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream; |
|
||||||
import java.io.ByteArrayOutputStream; |
|
||||||
import java.io.InputStream; |
|
||||||
import java.nio.charset.StandardCharsets; |
|
||||||
import java.security.KeyFactory; |
|
||||||
import java.security.NoSuchAlgorithmException; |
|
||||||
import java.security.NoSuchProviderException; |
|
||||||
import java.security.PublicKey; |
|
||||||
import java.security.spec.InvalidKeySpecException; |
|
||||||
import java.security.spec.X509EncodedKeySpec; |
|
||||||
|
|
||||||
import javax.crypto.Cipher; |
|
||||||
|
|
||||||
import androidx.annotation.Nullable; |
|
||||||
|
|
||||||
|
|
||||||
public class SimpleRsa { |
|
||||||
|
|
||||||
private static final String ALGORITHM = "RSA"; |
|
||||||
private static final String TRANSFORMATION = "RSA/ECB/PKCS1Padding"; |
|
||||||
|
|
||||||
/** |
|
||||||
* 得到公钥 |
|
||||||
* |
|
||||||
* @param algorithm 算法 |
|
||||||
* @param bysKey key |
|
||||||
* @return 公钥 |
|
||||||
*/ |
|
||||||
private static PublicKey getPublicKeyFromX509(String algorithm, String bysKey) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException { |
|
||||||
byte[] decodedKey = Base64.decode(bysKey, Base64.DEFAULT); |
|
||||||
X509EncodedKeySpec x509 = new X509EncodedKeySpec(decodedKey); |
|
||||||
KeyFactory keyFactory; |
|
||||||
//适配Android P及以后版本,否则报错NoSuchAlgorithmException
|
|
||||||
//https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { |
|
||||||
keyFactory = KeyFactory.getInstance(algorithm); |
|
||||||
} else { |
|
||||||
keyFactory = KeyFactory.getInstance(algorithm, "BC"); |
|
||||||
} |
|
||||||
return keyFactory.generatePublic(x509); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 使用公钥加密 |
|
||||||
* |
|
||||||
* @param content 加密字符串 |
|
||||||
* @return 加密后的字符串 |
|
||||||
*/ |
|
||||||
@Nullable |
|
||||||
public static String encryptByPublic(String content, String RSA_PUBLIC_KEY) { |
|
||||||
try { |
|
||||||
PublicKey pubKey = getPublicKeyFromX509(ALGORITHM, RSA_PUBLIC_KEY); |
|
||||||
Cipher cipher = Cipher.getInstance(TRANSFORMATION); |
|
||||||
cipher.init(Cipher.ENCRYPT_MODE, pubKey); |
|
||||||
byte[] plaintext = content.getBytes(StandardCharsets.UTF_8); |
|
||||||
byte[] output = cipher.doFinal(plaintext); |
|
||||||
return new String(Base64.encode(output, Base64.DEFAULT)); |
|
||||||
} catch (Exception e) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 使用公钥解密 |
|
||||||
* |
|
||||||
* @param content 密文 |
|
||||||
* @return 解密后的字符串 |
|
||||||
*/ |
|
||||||
@Nullable |
|
||||||
public static String decryptByPublic(String content, String RSA_PUBLIC_KEY) { |
|
||||||
try { |
|
||||||
PublicKey pubkey = getPublicKeyFromX509(ALGORITHM, RSA_PUBLIC_KEY); |
|
||||||
Cipher cipher = Cipher.getInstance(TRANSFORMATION); |
|
||||||
cipher.init(Cipher.DECRYPT_MODE, pubkey); |
|
||||||
InputStream ins = new ByteArrayInputStream(Base64.decode(content, Base64.DEFAULT)); |
|
||||||
ByteArrayOutputStream writer = new ByteArrayOutputStream(); |
|
||||||
byte[] buf = new byte[128]; |
|
||||||
int offset; |
|
||||||
while ((offset = ins.read(buf)) != -1) { |
|
||||||
byte[] block; |
|
||||||
if (buf.length == offset) { |
|
||||||
block = buf; |
|
||||||
} else { |
|
||||||
block = new byte[offset]; |
|
||||||
System.arraycopy(buf, 0, block, 0, offset); |
|
||||||
} |
|
||||||
writer.write(cipher.doFinal(block)); |
|
||||||
} |
|
||||||
return new String(writer.toByteArray(), StandardCharsets.UTF_8); |
|
||||||
} catch (Exception e) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue