1 回答

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);
}
添加回答
舉報(bào)