首页
社区
课程
招聘
[求助]RSA算法逆向
发表于: 2015-3-31 21:52 7673

[求助]RSA算法逆向

2015-3-31 21:52
7673
程序是.net的
private bool Verify(byte[] data, byte[] signature)
{
//data =“FASASCNLBFEBFBFF000306A8”;
//signature=char[255];(就是一个256位的值);
	RSACryptoServiceProvider rSACryptoServiceProvider = (RSACryptoServiceProvider)this.mCertificate.PublicKey.Key;
	SHA1Managed sHA1Managed = new SHA1Managed();
	new UnicodeEncoding();
	byte[] rgbHash = sHA1Managed.ComputeHash(data);
	bool result = rSACryptoServiceProvider.VerifyHash(rgbHash, CryptoConfig.MapNameToOID("SHA1"), signature);
	return result;
}


上面两个参数的值现在是有,如果以后在仅仅知道data的情况下,算出来signature的值,该如何下手做啊。虚心求教!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 2143
活跃值: (720)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
LZ还是先看看RSA算吧吧,逆向?不需要,算法公开的。
从数学的角度来说,此算法不可逆
当然现在也有哈希表还是什么彩虹表能跑出来加密位数短的
据说1024位目前无法破解,2048位就是军用级别的了
且非对称加密有两个key,程序里面即使发现了一个key,也无法加密数据
即公钥加密私钥解密,私钥加密公钥解密
程序里面只会有一个密钥,你找到了也没用(除非作者把两个key都放程序里,那和不加密没区别)
too young too simple
2015-3-31 22:08
0
雪    币: 3165
活跃值: (3278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
逆向太困难了,只有自己生成一组密钥,替换程序里的,来算signature值
2015-4-1 10:26
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你的说法不值得推敲。不过大体意思还是对的

从数学的角度来说,此算法不可逆   =》 算法是可逆的,只是成本过于巨大,目前的计算条件无法在有限的时间内运算出来

据说1024位目前无法破解,2048位就是军用级别的了  =》 1024已经不安全了,各组织在下一代中已经要求升级密钥长度
2015-4-1 11:07
0
雪    币: 218
活跃值: (228)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
signature是用公钥加密后得到的,只能用私钥解密才能得到明文。。。。。。。你想自己构造signature去把私钥搞到吧,嘿嘿
2015-4-1 12:03
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我就是想计算私钥哈,有没有办法推敲一下,各位的理论性东西我都理解,并且signdata(data,"SHA1")模拟过。差私钥,公约是一个object包含的一个dll文件。数据都有 如何计算私钥呢 ? 关键之前没搞过rsa算法的破解。

我现在模拟了一个255进制的加法函数,一个一个破解,VerifyHash成功就说明对比成功了。但是这样比较耗时,(   VerifyHash(a,b) ---A已知,b是否唯一,如果唯一 就无解了)
代码:
private bool Verify(byte[] data, byte[] signature)
{
if (this.mCertificate == null)
{
//PtpInterface.Log(8, "NULL Certificate", 85, "Verify");
return false;
}


RSACryptoServiceProvider rSACryptoServiceProvider = (RSACryptoServiceProvider)this.mCertificate.PublicKey.Key;
SHA1Managed sHA1Managed = new SHA1Managed();
new UnicodeEncoding();
bool result = false;
byte[] rgbHash = sHA1Managed.ComputeHash(data);

UInt64 i = 1;
while (i++ < UInt64.MaxValue)
{
result = rSACryptoServiceProvider.VerifyHash(rgbHash, CryptoConfig.MapNameToOID("SHA1"), Encoding.ASCII.GetBytes(i.ToString("X2")));

if (result)
{
Console.WriteLine(Convert.ToBase64String(signature));
Console.WriteLine("找到结果:" + i + "\t" + i.ToString("X2") + "\n按任意键继续...");
Console.ReadKey();
}

if (i % 1000 == 0)
{
Console.WriteLine(i.ToString());
}
}

Console.WriteLine("end!");
//PtpInterface.Log(1, "License Verify: " + result.ToString(), 100, "Verify");
return result;
}


上面的代码是猜想 B的结果不唯一 所以就一直验证
2015-4-1 13:01
0
雪    币: 62
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
用一个验签过程来逆向私钥,这可能吗?

从你提供的信息看,你只给了公钥,希望得到私钥,这在目前几乎是不可能的。
2015-4-1 13:52
0
雪    币: 725
活跃值: (2098)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
patch it
2015-4-1 16:06
0
雪    币: 7907
活跃值: (3559)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=woniuxiu;1362599]
//signature=char[255];(就是一个256位的值);
[/QUOTE]
同学, 这是255byte, 不是256位, 而是256*8=2048位.
2015-4-15 11:22
0
游客
登录 | 注册 方可回帖
返回
//