日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[CISCN2018]crackme-java

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [CISCN2018]crackme-java 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[CISCN2018]crackme-java

題目

import java.math.BigInteger; import java.util.Random;public class Test0 {static BigInteger two =new BigInteger("2");static BigInteger p = new BigInteger("11360738295177002998495384057893129964980131806509572927886675899422214174408333932150813939357279703161556767193621832795605708456628733877084015367497711");static BigInteger h= new BigInteger("7854998893567208831270627233155763658947405610938106998083991389307363085837028364154809577816577515021560985491707606165788274218742692875308216243966916");/*Alice write the below algorithm for encryption.The public key {p, h} is broadcasted to everyone.@param val: The plaintext to encrypt.We suppose val only contains lowercase letter {a-z} and numeric charactors, and is at most 256 charactors in length.*/public static String pkEnc(String val){BigInteger[] ret = new BigInteger[2];BigInteger bVal=new BigInteger(val.toLowerCase(),36);BigInteger r =new BigInteger(new Random().nextInt()+"");ret[0]=two.modPow(r,p);ret[1]=h.modPow(r,p).multiply(bVal);return ret[0].toString(36)+"=="+ret[1].toString(36);}/* Alice write the below algorithm for decryption. x is her private key, which she will never let you know.public static String skDec(String val,BigInteger x){if(!val.contains("==")){return null;}else {BigInteger val0=new BigInteger(val.split("==")[0],36);BigInteger val1=new BigInteger(val.split("==")[1],36);BigInteger s=val0.modPow(x,p).modInverse(p);return val1.multiply(s).mod(p).toString(36);}}*/public static void main(String[] args) throws Exception {System.out.println("You intercepted the following message, which is sent from Bob to Alice:");System.out.println("eag0vit7sboilgcfu0fbkbrmjgs4pzi2oznmqrkey5h1bwicvborngscx050u8vpghi69xqjmotgrtj4vq8fgw9tzi916o034bu==ahcwy7c0qq5cnxdntssqrj972nhvzt5liqlq0cvv0o1fm2ee4205nemuy5tvkda0hyetu5a5xcqqov8exk901z5xebvkcdo3jiq1gj8pkxzhjaeg9z6syu58neijxy56am7d1l9grhgtgkkfc432wm6h3jr8y1xx");System.out.println("Please figure out the plaintext!");} }//eag0vit7sboilgcfu0fbkbrmjgs4pzi2oznmqrkey5h1bwicvborngscx050u8vpghi69xqjmotgrtj4vq8fgw9tzi916o034bu==ahcwy7c0qq5cnxdntssqrj972nhvzt5liqlq0cvv0o1fm2ee4205nemuy5tvkda0hyetu5a5xcqqov8exk901z5xebvkcdo3jiq1gj8pkxzhjaeg9z6syu58neijxy56am7d1l9grhgtgkkfc432wm6h3jr8y1xx

解題

您截獲了以下由Bob發送給Alice的消息:請找出明文!

Alice編寫以下加密算法。
公鑰{p,h}向每個人廣播。
@param val:要加密的明文。
我們假設val只包含小寫字母{a-z}和數字字符,長度最多為256個字符。

toLowerCase() 方法用于把字符串轉換為小寫。

Random().nextInt() 生成隨意整數

.modPow() 大數快速冪取模

.multiply(val)乘val

.modInverse(BigInteger m) 返回一個BigInteger,其值是 (this-1 mod m).

public boolean contains(CharSequence chars)參數chars – 要判斷的字符或字符串。返回值:如果包含指定的字符或字符串返回 true,否則返回 false。

toString(i) 方法用于返回以一個字符串表示的 Number 對象值。如果方法使用了原生的數據類型作為參數,返回原生數據類型的 String 對象值。如果方法有兩個參數, 返回用第二個參數指定基數表示的第一個參數的字符串表示形式。參數i – 要轉換的整數。返回值toString(): 返回表示 Integer 值的 String 對象。toString(int i): 返回表示指定 int 的 String 對象。

還是比較習慣用Python,題目給出的代碼翻譯成python差不多是

import gmpy2two = 2 p = 11360738295177002998495384057893129964980131806509572927886675899422214174408333932150813939357279703161556767193621832795605708456628733877084015367497711 h = 7854998893567208831270627233155763658947405610938106998083991389307363085837028364154809577816577515021560985491707606165788274218742692875308216243966916def pkEnc(val):bVal = val.lower()#val是明文r = random()+' 'ret = [pow(two,r,p),pow(h,r,p)*bVal]return ret[0]==ret[1]def skDec(val,x):if(not '==' in val):returnelse:val0 = val.split('==')[0]val1 = val.split('==')[1]s = gmpy2.invert(pow(val[0],x,p),p)return pow(val1*s,p)#c = eag0vit7sboilgcfu0fbkbrmjgs4pzi2oznmqrkey5h1bwicvborngscx050u8vpghi69xqjmotgrtj4vq8fgw9tzi916o034bu==ahcwy7c0qq5cnxdntssqrj972nhvzt5liqlq0cvv0o1fm2ee4205nemuy5tvkda0hyetu5a5xcqqov8exk901z5xebvkcdo3jiq1gj8pkxzhjaeg9z6syu58neijxy56am7d1l9grhgtgkkfc432wm6h3jr8y1xx

讀完程序來解題

爆破r來解:

from threading import Thread import base36p=11360738295177002998495384057893129964980131806509572927886675899422214174408333932150813939357279703161556767193621832795605708456628733877084015367497711 c1=int('a9hgrei38ez78hl2kkd6nvookaodyidgti7d9mbvctx3jjniezhlxs1b1xz9m0dzcexwiyhi4nhvazhhj8dwb91e7lbbxa4ieco',36)def calr(r0,pid):print("[Process%d]: start from %d" % (pid, r0))while r0 < 2**26*(pid+1):if pow(2,r0,p) == c1:f = open('r','w')f.write(r0)exit(0)r0+=1if r0 % 2**18 == 0:print('[Process%d]: now %d' % (pid, r0))print('[Process%d]: exited!' % pid)for i in range(0,32):t = Thread(target=calr,args=(i*2**26,i))t.start() #152351913c2 = int('2q17m8ajs7509yl9iy39g4znf08bw3b33vibipaa1xt5b8lcmgmk6i5w4830yd3fdqfbqaf82386z5odwssyo3t93y91xqd5jb0zbgvkb00fcmo53sa8eblgw6vahl80ykxeylpr4bpv32p7flvhdtwl4cxqzc', 36) h = int("7854998893567208831270627233155763658947405610938106998083991389307363085837028364154809577816577515021560985491707606165788274218742692875308216243966916")print(base36.dumps(c2//pow(h,r,p))) #ciscncongratulationsthisisdesignedbyalibabasecurity424218533

總結

以上是生活随笔為你收集整理的[CISCN2018]crackme-java的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。