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

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

JAVA中如何對文件進(jìn)行簽名和驗(yàn)證

JAVA中如何對文件進(jìn)行簽名和驗(yàn)證

紫衣仙女 2023-06-14 13:57:22
我必須在遠(yuǎn)程 SFTP 服務(wù)器中放置一個(gè)文件,然后我必須使用私鑰對文件進(jìn)行簽名,然后他們將使用公鑰對其進(jìn)行驗(yàn)證。我從響應(yīng)文件中收到“PGP 簽名驗(yàn)證失敗”錯(cuò)誤。所以我試圖驗(yàn)證來自JAVA的標(biāo)志。不過,我從簽名驗(yàn)證方法中得到的值是錯(cuò)誤的。任何幫助,將不勝感激。這是我放在一起的代碼。公共課 SignAndVerify {static final KeyFingerPrintCalculator FP_CALC = new BcKeyFingerprintCalculator();private static File publicKeyFile = new File("\\publicSign.asc");private static File privateKeyFile = new File("\\privateSign.asc");private static final BouncyCastleProvider provider = new BouncyCastleProvider();static {    Security.addProvider(provider);}public static void signFile(String fileName, PGPSecretKey secretKey, String secretPwd, boolean armor, OutputStream out)        throws PGPException {    BCPGOutputStream bOut = null;    OutputStream lOut = null;    InputStream fIn = null;    try {        OutputStream theOut = armor ? new ArmoredOutputStream(out) : out;        PGPPrivateKey pgpPrivKey = secretKey.extractPrivateKey(                new JcePBESecretKeyDecryptorBuilder().setProvider(provider).build(secretPwd.toCharArray()));        PGPSignatureGenerator sGen = new PGPSignatureGenerator(                new JcaPGPContentSignerBuilder(secretKey.getPublicKey().getAlgorithm(), PGPUtil.SHA1)                        .setProvider(provider));        sGen.init(PGPSignature.BINARY_DOCUMENT, pgpPrivKey);        Iterator<String> it = secretKey.getPublicKey().getUserIDs();        if (it.hasNext()) {            PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator();            spGen.setSignerUserID(false, (String) it.next());            sGen.setHashedSubpackets(spGen.generate());        }        bOut = new BCPGOutputStream(theOut);        sGen.generateOnePassVersion(false).encode(bOut);        PGPLiteralDataGenerator lGen = new PGPLiteralDataGenerator();        lOut = lGen.open(bOut, PGPLiteralData.BINARY, "filename", new Date(), new byte[2048]);        fIn = new BufferedInputStream(new FileInputStream(fileName));        byte[] buf = new byte[2048];        }
查看完整描述

1 回答

?
慕桂英3389331

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

首先,簽名者正在尋找任何可簽名的密鑰,而驗(yàn)證者正在尋找任何可加密的密鑰。根據(jù)您生成密鑰的方式和時(shí)間,這些可能不相同:使用子密鑰進(jìn)行加密(僅)被認(rèn)為是一種好的做法,并且至少二十年來都是默認(rèn)設(shè)置——有時(shí)也一個(gè)不同的用于數(shù)據(jù)簽名的子密鑰(僅保留用于密鑰簽名的主密鑰,也稱為“僅認(rèn)證”)。但是從技術(shù)上講,擁有一個(gè)具有數(shù)據(jù)簽名和加密功能的 RSA 主密鑰是可能的(并且還可以選擇進(jìn)行認(rèn)證,盡管它未被使用);在 GPG 中,這可以通過在“專家”模式下生成來完成,或者在最新版本中通過生成后編輯來完成。由于您沒有向我們展示您的秘密/私鑰的詳細(xì)信息 - 除非這些是僅測試密鑰,否則您不應(yīng)該向我們展示您可以妥協(xié) - 不可能告訴您的情況。如果您實(shí)際上使用不同的密鑰來嘗試簽名和驗(yàn)證,那么它當(dāng)然永遠(yuǎn)無法正常工作。

一般來說,接收方應(yīng)使用消息中keyid 指定的密鑰:發(fā)送方使用任何具有加密能力的公鑰進(jìn)行加密,在消息中識別該密鑰,接收方使用發(fā)送方選擇的密鑰的一半私鑰進(jìn)行解密;發(fā)送方使用任何可簽名的私鑰進(jìn)行簽名,在消息中識別該密鑰,接收方使用發(fā)送方選擇的密鑰的一半公鑰進(jìn)行驗(yàn)證。這將需要重新組織您的代碼以僅在讀取簽名包后選擇驗(yàn)證密鑰。現(xiàn)在我只是在其中添加了一張verifyFile支票sig.getKeyID() == publicKey.getKeyID()。

這在您的數(shù)據(jù)處理中留下了更嚴(yán)重的錯(cuò)誤signFile

   byte[] buf = new byte[2048];

    int ch;

    while ((ch = fIn.read(buf)) >= 0) {

        lOut.write(ch);

        sGen.update(buf, 0, ch);

    }

您計(jì)算輸入文件中所有數(shù)據(jù)的簽名,但您只為每個(gè)緩沖數(shù)據(jù)在消息中放入一個(gè)字節(jié);請參閱 javadoc OutputStream.write(int)。由于驗(yàn)證者使用消息中的數(shù)據(jù),該數(shù)據(jù)現(xiàn)在與已簽名的數(shù)據(jù)完全不同,簽名不應(yīng)該也不會驗(yàn)證。以及消息對接收者無用。相反做


  lOut.write(buf,0,ch);

或者像你一樣切換到一次一個(gè)字節(jié)的處理verifyFile


  int ch; // no byte[] buf

  while( (ch = fIn.read()) >= 0 ){

    lOut.write((byte)ch); // cast not needed but clarifies intent

    sig.update((byte)ch); 

  }


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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