2016-08-15 14 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、ノードなどでテスト済み)で確認できます。

Androidの場合、「saltLength」は読み取られず、32ビットに強制されるため、別の「saltLength」が使用されている場合、他のプラットフォームのデバイスから署名/署名を確認することはできません。 (私はそれをデスクトップ上でbrute-forcecing saltLength値によって検証しました)。

私は実際にそれをデバッグする方法はわかりません。まったく同じJavaコードは、デスクトップまたはAndroidで起動されたときとは異なる動作をします。 Androidで「saltLength」を強制する方法はありますか?

+0

。 –

+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); 
    } 
} 

をまたに私の以前のコードを更新:ロングにsaltLengthの種類を変更しないのはなぜ

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(); 
} 
関連する問題