第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

從模數(shù)和指數(shù)重建 RSA 私鑰失敗

從模數(shù)和指數(shù)重建 RSA 私鑰失敗

PHP
慕標(biāo)5832272 2023-06-24 15:19:53
我正在嘗試從模數(shù)和私有/公共指數(shù)重建 RSA 密鑰對(duì)。比較編碼的私鑰時(shí),轉(zhuǎn)換對(duì)于公鑰正確,但對(duì)于私鑰則失敗。當(dāng)使用此重建私鑰/公鑰對(duì)進(jìn)行加密時(shí),它在 Java 中可以工作(?。钱?dāng)在 PHP 中使用重建密鑰對(duì)時(shí),解密部分失?。用苷诠ぷ鳎栽谖铱磥?,重建私鑰是不同的到“原始”私鑰。僅供參考:使用“原始”密鑰對(duì),PHP 中一切正常。所以我的問題是:如何從(BigInteger)模數(shù)和私有指數(shù)中檢索“原始”私鑰?編輯:最后查看我的最終編輯我的示例代碼顯示了公鑰與重建密鑰的相等性,并且私鑰是不同的:Rebuilding of a RSA PrivateKey from modulus & exponentprivateKey equals rebuild: falsepublicKey equals rebuild: true代碼:import java.math.BigInteger;import java.security.*;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.InvalidKeySpecException;import java.security.spec.RSAPrivateKeySpec;import java.security.spec.RSAPublicKeySpec;import java.util.Arrays;public class RebuildRSAPrivateKey {    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException {        System.out.println("Rebuilding of a RSA PrivateKey from modulus & exponent");        // rsa key generation        KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");        //kpGen.initialize(2048, new SecureRandom());        kpGen.initialize(2048, new SecureRandom());        KeyPair keyPair = kpGen.generateKeyPair();        // private key        PrivateKey privateKey = keyPair.getPrivate();        // get modulus & exponent        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) privateKey;        BigInteger modulus = rsaPrivateKey.getModulus();        BigInteger privateExponent = rsaPrivateKey.getPrivateExponent();    }}編輯:以下程序?qū)@示從編碼密鑰派生的 RSA 私鑰/公鑰對(duì)可以恢復(fù),并且加密和解密可以在 Java 和 PHP 中進(jìn)行。密鑰是不安全的RSA 512 位密鑰并經(jīng)過 Base64 解碼。然后從模數(shù)和私有/公共指數(shù)派生出相同的密鑰,并且加密/解密在 Java 中有效,但在 PHP 中無效。這就是為什么我想從模數(shù)和指數(shù)中獲取“原始”RSA 密鑰,感謝您的好意幫助。
查看完整描述

1 回答

?
蠱毒傳說

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊

執(zhí)行 RSA 解密操作所需的最少信息是模數(shù)n和解密指數(shù)d。有一種優(yōu)化可以應(yīng)用于涉及中國(guó)余數(shù)定理的 RSA 解密,其中分別對(duì) RSA 素?cái)?shù)進(jìn)行求冪,然后組合以產(chǎn)生最終值,因此RSA 私鑰語法中有一些用于此目的的額外字段以及RSAPrivateCrtKey模仿它的Java接口。

現(xiàn)在這里提出的問題是:兩個(gè) RSAPrivateCrtKey 實(shí)例何時(shí)相等?我認(rèn)為當(dāng)它們?cè)?RSA 算法中功能相同時(shí),它們是相等的。您要求更狹窄的定義,即當(dāng)它們的編碼形式相等時(shí)它們相等。這個(gè)定義的問題在于它過于特定于實(shí)現(xiàn)。目前,當(dāng)“Sun”提供商生成密鑰對(duì)時(shí),它總是對(duì)素?cái)?shù)進(jìn)行排序pq使得p>?q。但我喜歡另一種方式,其中p<?q。RSAPrivateCrtKey 接口不關(guān)心任何一種方式,因?yàn)樗贿M(jìn)行檢查。該接口的 Javadoc 沒有指定順序。您可以更改我的代碼以生成與以下內(nèi)容相同的編碼形式當(dāng)前的“Sun”實(shí)現(xiàn)只需反轉(zhuǎn)p.compareTo(q) > 0.?但是,默認(rèn)實(shí)現(xiàn)可以更改以符合我將來的偏好,如果我接管世界的計(jì)劃成功的話,默認(rèn)實(shí)現(xiàn)就會(huì)更改。Javadoc 是規(guī)范,只要符合 Javadocs,實(shí)現(xiàn)就可以更改。

下面我提供了一個(gè)相等函數(shù)的實(shí)現(xiàn),其中我嘗試合并與規(guī)范一致的盡可能廣泛的相等概念。也就是說,在 RSA 算法中使用時(shí),任何兩個(gè)keyEquals返回的RSAPrivateCRTKey 實(shí)例都應(yīng)該產(chǎn)生相同的結(jié)果,并且如果返回,則應(yīng)該至少有一個(gè)值會(huì)產(chǎn)生不同的結(jié)果。truefalse


public static boolean keyEquals(RSAPrivateCrtKey k1, RSAPrivateCrtKey k2) {


? ? final BigInteger ZERO = BigInteger.ZERO;


? ? boolean result = true;


? ? result = result && isConsistent(k1) && isConsistent(k2);

? ? result = result && k1.getModulus().equals(k2.getModulus());

? ? BigInteger lambda = computeCarmichaelLambda(k1.getPrimeP(), k1.getPrimeQ());


? ? result = result && k1.getPublicExponent().subtract(k2.getPublicExponent()).mod(lambda).equals(ZERO);

? ? result = result && k1.getPrivateExponent().subtract(k2.getPrivateExponent()).mod(lambda).equals(ZERO);


? ? return result;

}


private static boolean isConsistent(RSAPrivateCrtKey k1) {

? ? final BigInteger ZERO = BigInteger.ZERO;

? ? final BigInteger ONE = BigInteger.ONE;


? ? BigInteger n = k1.getModulus();

? ? BigInteger p = k1.getPrimeP();

? ? BigInteger q = k1.getPrimeQ();

? ? BigInteger e = k1.getPublicExponent();

? ? BigInteger d = k1.getPrivateExponent();


? ? boolean result = true;


? ? result = p.multiply(q).equals(n);

? ? BigInteger lambda = computeCarmichaelLambda(p, q);

? ? result = result && e.multiply(d).mod(lambda).equals(ONE);

? ? result = result && d.subtract(key.getPrimeExponentP()).mod(p.subtract(ONE)).equals(ZERO);

? ? result = result && d.subtract(key.getPrimeExponentQ()).mod(q.subtract(ONE)).equals(ZERO);

? ? result = result && q.multiply(k1.getCrtCoefficient()).mod(p).equals(ONE);

? ? return result;

}


private static BigInteger computeCarmichaelLambda(BigInteger p, BigInteger q) {

? ? return lcm(p.subtract(BigInteger.ONE), q.subtract(BigInteger.ONE));

}


private static BigInteger lcm(BigInteger x, BigInteger y) {

? ? return x.multiply(y).divide(x.gcd(y));

}


查看完整回答
反對(duì) 回復(fù) 2023-06-24
  • 1 回答
  • 0 關(guān)注
  • 175 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)