吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1384|回复: 4
收起左侧

[Android 讨论] 算法基础(非对称加密算法)

[复制链接]
Chenda1 发表于 2022-4-6 20:45
算法基础(消息摘要算法)https://www.52pojie.cn/thread-1613919-1-1.html(出处: 吾爱破解论坛)
算法基础(对称加密算法)https://www.52pojie.cn/thread-1615926-1-1.html(出处: 吾爱破解论坛)

RSA算法(JAVA)
使用公钥加密、私钥解密
公钥公开、私钥保密
安全性高、一般明文字节数<密钥字节数-11
RSA可用于数据交换、数据校验(MDwithRSA)
两种加密算法结合套路
随机生成密钥
密钥用于AES、DES、3DES加密数据
RSA对密钥加密
提交加密后的密钥和加密后的数据给服务器
算法 密钥长度工作模式 填充方式 备注
RSA512~65536位(密钥长度必须是64的倍数) ECB NoPadding、
PKCS1Padding、
OAEPWTTHMD5AndMGFPadding、
OAEPWITHSHA1AndMGFIPadding、
OAEPWITHSHA256AndMGF1Padding、
OAEPWITHSHA384AndMGF1Padding、OAEPWITHSHA512AndMGF1Padding
Java 6实现
NONENoPadding、
PKCS1Padding、
OAEPWithMD5AndMGF1Padding、OAEPWithSHA1AndMGF1Padding、
OAEPWithSHA224AndMGFIPadding、
OAEPWithSHA256AndMGFIPadding、
OAEPWithSHA384AndMGFIPadding、
OAEPWithSHA512AndMGF1Padding、
ISO9796-1Padding
BouncyCastle
实现



[Java] 纯文本查看 复制代码
[size=3]import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Base64.Encoder;
import javax.crypto.Cipher;

public class RSA {

	//公钥
	public static String str_pubK="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDxNrfFmfAAmP0kWOc09mHvJpUz"
			+ "h66gfLyWRs/3eJasiwaBVwoLpA2bFwO6oABMsBV+jcJxlgoKhmv9dAd1KoNtUuTg"
			+ "ktl4BwBVkhqGkdNLXqJlpJ4ckgZLHoGjIFGehVwvKQ6Nilmimo66Jkl3OvTubaq1"
			+ "hHhpTpFV15xN6wDUXQIDAQAB";
	//私钥
	public static String str_priK="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAPE2t8WZ8ACY/SRY"
			+ "5zT2Ye8mlTOHrqB8vJZGz/d4lqyLBoFXCgukDZsXA7qgAEywFX6NwnGWCgqGa/10"
			+ "B3Uqg21S5OCS2XgHAFWSGoaR00teomWknhySBksegaMgUZ6FXC8pDo2KWaKajrom"
			+ "SXc69O5tqrWEeGlOkVXXnE3rANRdAgMBAAECgYEAxyUQxiBYaHXmkQqhIDXGFya4"
			+ "icmcX718CWm/KyYw55UEMuaEUaYI4aE3n+2XMbkylcA9538jHRtrrt4Lhi0qQQ59"
			+ "1baXhTcgVIzOYmLN9F2dQPuf7UVP25FJ6RmakteZAgkr9/VPqx2frlli/SjtdwOs"
			+ "ZoyxYy/TzplL7rjzvLUCQQD+fhsCj2OCR5PL1VOm72qDiyqd74kf9HyBb2G+0tHy"
			+ "N60SnN6vfQq+0y8xDTUYUv1y34RxSuNuh+JOP1dptAhbAkEA8qR6LApDr+XHBCW9"
			+ "OB0ny5QRzpjFA9U2isNt0ynGPRlEpmj40uLpi0H8FHEeiqdHUSTXLunTv2ebs12d"
			+ "obPzpwJAVZ7VtYHKZ81vExfdgf9wpXsPxn0NdFvL+7wedZX2HnjO2MFARmhaUiM4"
			+ "8FbSMzHQpXI/2+HnLIu4/rxey2hPmwJAR867RTtIas7iheyxQeEG/O12E6EMdSTt"
			+ "PkW1w89SFpTaxzC7qpVyrj653kbX1grJRU9Uy1Jx0uxTnNJwqwE5cwJAXulSSoAa"
			+ "EhCrN2MPEmzHz21GH5ImFa96s3PZLakO5XGna86Dx3/xWuyYVmlv+yY3uf/Dk8Ib"
			+ "gx6n6lvVot29tg==";
	
	public static PublicKey getpublicKey(String key) throws Exception {
		//公钥解码
		byte[] keyBytes= Base64.getDecoder().decode(key);
		//公钥实例化函数
		X509EncodedKeySpec keySpec	= new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory= KeyFactory.getInstance("RSA");
		//最终加密公钥
		PublicKey publicKey = keyFactory.generatePublic(keySpec);
		return publicKey;
		
	}
	
	public static PrivateKey getprivateKey(String key) throws Exception {
		//私钥解码
		byte[] keyBytes= Base64.getDecoder().decode(key);
		//私钥实例化函数
		PKCS8EncodedKeySpec keySpec	= new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory keyFactory= KeyFactory.getInstance("RSA");
		//最终加密私钥(私有)
		PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
		return privateKey;
		
	}
	//(公钥+明文)加密
	public static byte[] encrypt(byte[] bt_plaintext) throws Exception {
		PublicKey publicKey= getpublicKey(str_pubK);
		Cipher cipher= Cipher.getInstance("RSA/ECB/PKCS1Padding");
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		byte[] bt_encrypted= cipher.doFinal(bt_plaintext);
		return bt_encrypted;
	}
	//私钥解密
	public static byte[] decrypt(byte[] bt_encrypted) throws Exception {
		PrivateKey privateKey= getprivateKey(str_priK);
		Cipher cipher= Cipher.getInstance("RSA/ECB/PKCS1Padding");
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		byte[] bt_original= cipher.doFinal(bt_encrypted);
		return bt_original;
	}[/size]
[size=3]
[/size]
[size=3]
	//签名
	public static byte[] sign(byte[] data) throws Exception {
		PrivateKey prik = getprivateKey(str_priK);
		Signature sig = Signature.getInstance("SHA256withRSA");
		sig.initSign(prik);
		sig.update(data);
		return sig.sign();
	}
	//验证签名
	public static boolean verify(byte[] data,byte[] sign) throws Exception {
		PublicKey pubk = getpublicKey(str_pubK);
		Signature sig = Signature.getInstance("SHA256withRSA");
		sig.initVerify(pubk);
		sig.update(data);
		return sig.verify(sign);
	}	
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub

		String str_plaintext="吾爱破解";
		byte[] bt_ciphre= encrypt(str_plaintext.getBytes());
		System.out.println("明文:"+str_plaintext);
		
		System.out.println("加密结果显示为十六进制:"+byteToHexString(bt_ciphre));
		
		byte[] bt_original=decrypt(bt_ciphre);
		String str_original= new String(bt_original);
		System.out.println("解密:"+str_original);
		System.out.println("==============================");[/size]
[size=3]
[/size]
[size=3]
                String str="52pojie";
		byte[] signature= sign(str.getBytes());
		System.out.println("原文:"+str);
		System.out.println("产生签名:"+Base64.getEncoder().encode(signature));
		boolean status= verify(str.getBytes(), signature);
		System.out.println("验证情况:"+status);		
	}
	//字节集转十六进制
	public static String byteToHexString(byte[ ] by) {
		StringBuffer SB = new StringBuffer();
		int i = 0;
		while (i < by. length) {
		int k = by[i];
		int j = k;
		if (k < 0) {
		j = k + 256;}
		if (j < 16) {
		SB.append("0");}
		SB.append( Integer.toHexString(j));i +=1;
		}
		return SB.toString();
		}
}[/size]


RSA算法(JS)
function getRSA(password,pubkey){
setMaxDigits(131);//最低是密钥字节数+1
var key = new RSAKeyPair("10001",pubkey);
return encryptedString(key,password);
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
junjia215 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Ontheroad02 发表于 2022-4-6 21:15
应该发给同行让他们看看
69332748a 发表于 2022-4-6 22:06
头像被屏蔽
tlf 发表于 2022-4-7 08:29
rz66 发表于 2022-4-7 08:35
楼主的标题为什么不写  “RSA 算法java和Android如何一致”   ?
Java中
public static final String KEY_ALGORITHM = "RSA";

Android中
public static final String KEY_ALGORITHM = "RSA/ECB/PKCS1Padding";

获取Cipher
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);

复制粘贴 好简单。 学习到了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-30 00:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表