2016-08-15 17 views
1

我用下面的代碼,以便對數據進行簽名:BouncyCastle的,不同的行爲對桌面/ Android的簽名

static public byte[] sign(byte[] data, PrivateKey privateKey, int saltLength) throws Exception { 
    Signature instance = Signature.getInstance("SHA256withRSA/PSS", provider); 
    MGF1ParameterSpec mgf1ParameterSpec = new MGF1ParameterSpec("SHA-256"); 
    PSSParameterSpec pssParameterSpec = new PSSParameterSpec("SHA-256", "MGF1",mgf1ParameterSpec , saltLength, 1); 
    instance.setParameter(pssParameterSpec); 
    instance.initSign(privateKey); 
    instance.update(data); 
    return instance.sign(); 
} 

(代碼是用於檢查標誌非常相似)

桌面上,此代碼工作正常,可以用其他平臺檢查簽名(用python,node,...進行測試)。

在Android上,「saltLength」未被讀取,並且被強制爲32位,所以如果使用另一個「saltLength」,我無法在其他平臺上籤署/驗證簽名。 (我通過在桌面上強制saltLength值來驗證它)。

我真的不知道如何調試它,在桌面或Android上啓動的Java代碼具有不同的行爲。任何想法如何在Android上強制「saltLength」?

+0

爲什麼不改變saltLength的類型長。 –

+0

因爲'PSSParameterSpec'構造函數是'public PSSParameterSpec(String mdName,String mgfName,AlgorithmParameterSpec mgfSpec,int saltLen,int trailerField)' – Blusky

回答

0

好的,所以經過桌面和Android方面的許多測試... 我還沒有找到什麼是問題的根源(我猜java.security.Signature$SignatureImpl不同的實現,但不知道... ... )

但是,我發現一個解決任何人遇到同樣的問題。 我創建了以下類:

public class SHA256withRSACustomPadding extends PSSSignatureSpi { 
    public SHA256withRSACustomPadding(int padding) { 
     super(new RSABlindedEngine(), new PSSParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-256"), padding, 1)); 
    } 

    public void initSign(PrivateKey privateKey) throws InvalidKeyException { 
     engineInitSign(privateKey); 
    } 

    public void update(byte[] data) throws SignatureException { 
     engineUpdate(data,0,data.length); 
    } 

    public byte[] sign() throws SignatureException { 
     return engineSign(); 
    } 

    public void initVerify(PublicKey publicKey) throws InvalidKeyException { 
     engineInitVerify(publicKey); 
    } 

    public boolean verify(byte[] data) throws SignatureException { 
     return engineVerify(data); 
    } 
} 

和更新,我以前的代碼:

static public byte[] sign(byte[] data, PrivateKey privateKey, int saltLength) throws Exception { 
    SHA256withRSACustomPadding instance = new SHA256withRSACustomPadding(padding); 
    instance.initSign(privateKey); 
    instance.update(data); 
    return instance.sign(); 
}