RSAUtil.smali
.class public final Lcom/baidu/android/common/security/RSAUtil;
.super Ljava/lang/Object;
# static fields
.field public static final ALGORITHM_RSA:Ljava/lang/String; = "RSA"
.field public static final BYTE_IN_BITS:I = 0x8
.field public static final PRIVATE_KEY:Ljava/lang/String; = "PrivateKey"
.field public static final PT_MAXLEN_OFFSET:I = 0xb
.field public static final PUBLIC_KEY:Ljava/lang/String; = "PublicKey"
# direct methods
.method private constructor <init>()V
.registers 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static decryptByPrivateKey([BLjava/lang/String;)[B
.registers 5
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/Exception;
}
.end annotation
invoke-virtual {p1}, Ljava/lang/String;->getBytes()[B
move-result-object v0
invoke-static {v0}, Lcom/baidu/android/common/security/Base64;->decode([B)[B
move-result-object v0
new-instance v1, Ljava/security/spec/PKCS8EncodedKeySpec;
invoke-direct {v1, v0}, Ljava/security/spec/PKCS8EncodedKeySpec;-><init>([B)V
const-string v0, "RSA"
invoke-static {v0}, Ljava/security/KeyFactory;->getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;
move-result-object v0
invoke-virtual {v0, v1}, Ljava/security/KeyFactory;->generatePrivate(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;
move-result-object v0
const-string v1, "RSA/ECB/PKCS1Padding"
invoke-static {v1}, Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;
move-result-object v1
const/4 v2, 0x2
invoke-virtual {v1, v2, v0}, Ljavax/crypto/Cipher;->init(ILjava/security/Key;)V
invoke-virtual {v1, p0}, Ljavax/crypto/Cipher;->doFinal([B)[B
move-result-object v0
return-object v0
.end method
.method public static decryptByPublicKey([BLjava/lang/String;)[B
.registers 5
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/Exception;
}
.end annotation
invoke-virtual {p1}, Ljava/lang/String;->getBytes()[B
move-result-object v0
invoke-static {v0}, Lcom/baidu/android/common/security/Base64;->decode([B)[B
move-result-object v0
new-instance v1, Ljava/security/spec/X509EncodedKeySpec;
invoke-direct {v1, v0}, Ljava/security/spec/X509EncodedKeySpec;-><init>([B)V
const-string v0, "RSA"
invoke-static {v0}, Ljava/security/KeyFactory;->getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;
move-result-object v0
invoke-virtual {v0, v1}, Ljava/security/KeyFactory;->generatePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;
move-result-object v0
const-string v1, "RSA/ECB/PKCS1Padding"
invoke-static {v1}, Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;
move-result-object v1
const/4 v2, 0x2
invoke-virtual {v1, v2, v0}, Ljavax/crypto/Cipher;->init(ILjava/security/Key;)V
invoke-virtual {v1, p0}, Ljavax/crypto/Cipher;->doFinal([B)[B
move-result-object v0
return-object v0
.end method
.method public static decryptLongByPrivateKey([BLjava/lang/String;I)[B
.registers 11
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/Exception;
}
.end annotation
const/4 v3, 0x0
invoke-virtual {p1}, Ljava/lang/String;->getBytes()[B
move-result-object v0
invoke-static {v0}, Lcom/baidu/android/common/security/Base64;->decode([B)[B
move-result-object v0
new-instance v1, Ljava/security/spec/PKCS8EncodedKeySpec;
invoke-direct {v1, v0}, Ljava/security/spec/PKCS8EncodedKeySpec;-><init>([B)V
const-string v0, "RSA"
invoke-static {v0}, Ljava/security/KeyFactory;->getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;
move-result-object v0
invoke-virtual {v0, v1}, Ljava/security/KeyFactory;->generatePrivate(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;
move-result-object v0
const-string v1, "RSA/ECB/PKCS1Padding"
invoke-static {v1}, Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;
move-result-object v4
const/4 v1, 0x2
invoke-virtual {v4, v1, v0}, Ljavax/crypto/Cipher;->init(ILjava/security/Key;)V
div-int/lit8 v1, p2, 0x8
new-instance v5, Ljava/lang/StringBuilder;
invoke-direct {v5}, Ljava/lang/StringBuilder;-><init>()V
array-length v6, p0
move v2, v3
:goto_2b
if-ge v2, v6, :cond_46
sub-int v0, v6, v2
if-ge v1, v0, :cond_32
move v0, v1
:cond_32
new-array v7, v0, [B
invoke-static {p0, v2, v7, v3, v0}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
add-int/2addr v0, v2
new-instance v2, Ljava/lang/String;
invoke-virtual {v4, v7}, Ljavax/crypto/Cipher;->doFinal([B)[B
move-result-object v7
invoke-direct {v2, v7}, Ljava/lang/String;-><init>([B)V
invoke-virtual {v5, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move v2, v0
goto :goto_2b
:cond_46
invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-virtual {v0}, Ljava/lang/String;->getBytes()[B
move-result-object v0
return-object v0
.end method
.method public static encryptByPrivateKey([BLjava/lang/String;)[B
.registers 5
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/Exception;
}
.end annotation
invoke-virtual {p1}, Ljava/lang/String;->getBytes()[B
move-result-object v0
invoke-static {v0}, Lcom/baidu/android/common/security/Base64;->decode([B)[B
move-result-object v0
new-instance v1, Ljava/security/spec/PKCS8EncodedKeySpec;
invoke-direct {v1, v0}, Ljava/security/spec/PKCS8EncodedKeySpec;-><init>([B)V
const-string v0, "RSA"
invoke-static {v0}, Ljava/security/KeyFactory;->getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;
move-result-object v0
invoke-virtual {v0, v1}, Ljava/security/KeyFactory;->generatePrivate(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;
move-result-object v0
const-string v1, "RSA/ECB/PKCS1Padding"
invoke-static {v1}, Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;
move-result-object v1
const/4 v2, 0x1
invoke-virtual {v1, v2, v0}, Ljavax/crypto/Cipher;->init(ILjava/security/Key;)V
invoke-virtual {v1, p0}, Ljavax/crypto/Cipher;->doFinal([B)[B
move-result-object v0
return-object v0
.end method
.method public static encryptByPublicKey([BLjava/lang/String;)[B
.registers 5
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/Exception;
}
.end annotation
invoke-virtual {p1}, Ljava/lang/String;->getBytes()[B
move-result-object v0
invoke-static {v0}, Lcom/baidu/android/common/security/Base64;->decode([B)[B
move-result-object v0
new-instance v1, Ljava/security/spec/X509EncodedKeySpec;
invoke-direct {v1, v0}, Ljava/security/spec/X509EncodedKeySpec;-><init>([B)V
const-string v0, "RSA"
invoke-static {v0}, Ljava/security/KeyFactory;->getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;
move-result-object v0
invoke-virtual {v0, v1}, Ljava/security/KeyFactory;->generatePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;
move-result-object v0
const-string v1, "RSA/ECB/PKCS1Padding"
invoke-static {v1}, Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;
move-result-object v1
const/4 v2, 0x1
invoke-virtual {v1, v2, v0}, Ljavax/crypto/Cipher;->init(ILjava/security/Key;)V
invoke-virtual {v1, p0}, Ljavax/crypto/Cipher;->doFinal([B)[B
move-result-object v0
return-object v0
.end method
.method public static encryptLongByPublicKey([BLjava/lang/String;I)[B
.registers 13
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/Exception;
}
.end annotation
const/4 v3, 0x0
invoke-virtual {p1}, Ljava/lang/String;->getBytes()[B
move-result-object v0
invoke-static {v0}, Lcom/baidu/android/common/security/Base64;->decode([B)[B
move-result-object v0
new-instance v1, Ljava/security/spec/X509EncodedKeySpec;
invoke-direct {v1, v0}, Ljava/security/spec/X509EncodedKeySpec;-><init>([B)V
const-string v0, "RSA"
invoke-static {v0}, Ljava/security/KeyFactory;->getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;
move-result-object v0
invoke-virtual {v0, v1}, Ljava/security/KeyFactory;->generatePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;
move-result-object v0
const-string v1, "RSA/ECB/PKCS1Padding"
invoke-static {v1}, Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;
move-result-object v5
const/4 v1, 0x1
invoke-virtual {v5, v1, v0}, Ljavax/crypto/Cipher;->init(ILjava/security/Key;)V
div-int/lit8 v6, p2, 0x8
add-int/lit8 v1, v6, -0xb
array-length v7, p0
add-int v0, v7, v1
add-int/lit8 v0, v0, -0x1
div-int/2addr v0, v1
mul-int/2addr v0, v6
new-array v8, v0, [B
move v2, v3
move v4, v3
:goto_31
if-ge v4, v7, :cond_49
sub-int v0, v7, v4
if-ge v1, v0, :cond_38
move v0, v1
:cond_38
new-array v9, v0, [B
invoke-static {p0, v4, v9, v3, v0}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
add-int/2addr v4, v0
invoke-virtual {v5, v9}, Ljavax/crypto/Cipher;->doFinal([B)[B
move-result-object v0
invoke-static {v0, v3, v8, v2, v6}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V
add-int v0, v2, v6
move v2, v0
goto :goto_31
:cond_49
return-object v8
.end method
.method public static generateKey(I)Ljava/util/Map;
.registers 5
.annotation system Ldalvik/annotation/Signature;
value = {
"(I)",
"Ljava/util/Map",
"<",
"Ljava/lang/String;",
"Ljava/lang/Object;",
">;"
}
.end annotation
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/security/NoSuchAlgorithmException;
}
.end annotation
const-string v0, "RSA"
invoke-static {v0}, Ljava/security/KeyPairGenerator;->getInstance(Ljava/lang/String;)Ljava/security/KeyPairGenerator;
move-result-object v0
invoke-virtual {v0, p0}, Ljava/security/KeyPairGenerator;->initialize(I)V
invoke-virtual {v0}, Ljava/security/KeyPairGenerator;->generateKeyPair()Ljava/security/KeyPair;
move-result-object v1
invoke-virtual {v1}, Ljava/security/KeyPair;->getPublic()Ljava/security/PublicKey;
move-result-object v0
check-cast v0, Ljava/security/interfaces/RSAPublicKey;
invoke-virtual {v1}, Ljava/security/KeyPair;->getPrivate()Ljava/security/PrivateKey;
move-result-object v1
check-cast v1, Ljava/security/interfaces/RSAPrivateKey;
new-instance v2, Ljava/util/HashMap;
const/4 v3, 0x2
invoke-direct {v2, v3}, Ljava/util/HashMap;-><init>(I)V
const-string v3, "PublicKey"
invoke-interface {v2, v3, v0}, Ljava/util/Map;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
const-string v0, "PrivateKey"
invoke-interface {v2, v0, v1}, Ljava/util/Map;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
return-object v2
.end method
.method public static generateRSAPrivateKey(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/security/interfaces/RSAPrivateKey;
.registers 4
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/Exception;
}
.end annotation
:try_start_0
const-string v0, "RSA"
invoke-static {v0}, Ljava/security/KeyFactory;->getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;
:try_end_5
.catch Ljava/security/NoSuchAlgorithmException; {:try_start_0 .. :try_end_5} :catch_12
move-result-object v0
new-instance v1, Ljava/security/spec/RSAPrivateKeySpec;
invoke-direct {v1, p0, p1}, Ljava/security/spec/RSAPrivateKeySpec;-><init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V
:try_start_b
invoke-virtual {v0, v1}, Ljava/security/KeyFactory;->generatePrivate(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;
move-result-object v0
check-cast v0, Ljava/security/interfaces/RSAPrivateKey;
:try_end_11
.catch Ljava/security/spec/InvalidKeySpecException; {:try_start_b .. :try_end_11} :catch_1d
return-object v0
:catch_12
move-exception v0
new-instance v1, Ljava/lang/Exception;
invoke-virtual {v0}, Ljava/security/NoSuchAlgorithmException;->getMessage()Ljava/lang/String;
move-result-object v0
invoke-direct {v1, v0}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
throw v1
:catch_1d
move-exception v0
new-instance v1, Ljava/lang/Exception;
invoke-virtual {v0}, Ljava/security/spec/InvalidKeySpecException;->getMessage()Ljava/lang/String;
move-result-object v0
invoke-direct {v1, v0}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
throw v1
.end method
.method public static generateRSAPublicKey(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/security/interfaces/RSAPublicKey;
.registers 4
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/Exception;
}
.end annotation
:try_start_0
const-string v0, "RSA"
invoke-static {v0}, Ljava/security/KeyFactory;->getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;
:try_end_5
.catch Ljava/security/NoSuchAlgorithmException; {:try_start_0 .. :try_end_5} :catch_12
move-result-object v0
new-instance v1, Ljava/security/spec/RSAPublicKeySpec;
invoke-direct {v1, p0, p1}, Ljava/security/spec/RSAPublicKeySpec;-><init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V
:try_start_b
invoke-virtual {v0, v1}, Ljava/security/KeyFactory;->generatePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;
move-result-object v0
check-cast v0, Ljava/security/interfaces/RSAPublicKey;
:try_end_11
.catch Ljava/security/spec/InvalidKeySpecException; {:try_start_b .. :try_end_11} :catch_1d
return-object v0
:catch_12
move-exception v0
new-instance v1, Ljava/lang/Exception;
invoke-virtual {v0}, Ljava/security/NoSuchAlgorithmException;->getMessage()Ljava/lang/String;
move-result-object v0
invoke-direct {v1, v0}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
throw v1
:catch_1d
move-exception v0
new-instance v1, Ljava/lang/Exception;
invoke-virtual {v0}, Ljava/security/spec/InvalidKeySpecException;->getMessage()Ljava/lang/String;
move-result-object v0
invoke-direct {v1, v0}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
throw v1
.end method
.method public static getPrivateKey(Ljava/util/Map;)Ljava/lang/String;
.registers 3
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/util/Map",
"<",
"Ljava/lang/String;",
"Ljava/lang/Object;",
">;)",
"Ljava/lang/String;"
}
.end annotation
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/lang/Exception;
}
.end annotation
const-string v0, "PrivateKey"
invoke-interface {p0, v0}, Ljava/util/Map;->get(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/security/Key;
invoke-interface {v0}, Ljava/security/Key;->getEncoded()[B
move-result-object v0
const-string v1, "utf-8"
invoke-static {v0, v1}, Lcom/baidu/android/common/security/Base64;->encode([BLjava/lang/String;)Ljava/lang/String;
move-result-object v0
return-object v0
.end method
.method public static getPublicKey(Ljava/util/Map;)Ljava/lang/String;
.registers 3
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/util/Map",
"<",
"Ljava/lang/String;",
"Ljava/lang/Object;",
">;)",
"Ljava/lang/String;"
}
.end annotation
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/UnsupportedEncodingException;
}
.end annotation
const-string v0, "PublicKey"
invoke-interface {p0, v0}, Ljava/util/Map;->get(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/security/Key;
invoke-interface {v0}, Ljava/security/Key;->getEncoded()[B
move-result-object v0
const-string v1, "utf-8"
invoke-static {v0, v1}, Lcom/baidu/android/common/security/Base64;->encode([BLjava/lang/String;)Ljava/lang/String;
move-result-object v0
return-object v0
.end method