2012-11-25 67 views
1

我想從簽名內容中提取原始數據。從已簽名內容中讀取原始數據java

在下面的代碼,簽名的數據是「CMSSignedData簽署」

,我發現,StackOverflow的幾個類似的答案,但所有的答案不能 狀態如何提取簽名內容的原始數據。

問候

package chapter9; 

import java.security.KeyStore; 
import java.security.PrivateKey; 
import java.security.cert.*; 
import java.util.Arrays; 

import org.apache.commons.codec.binary.Base64; 
import org.bouncycastle.cms.CMSProcessable; 
import org.bouncycastle.cms.CMSProcessableByteArray; 
import org.bouncycastle.cms.CMSSignedData; 
import org.bouncycastle.cms.CMSSignedDataGenerator; 

/** 
* Example of generating a detached signature. 
*/ 
public class SignedDataExample 
    extends SignedDataProcessor 
{ 

    public static void main(String[] args) 
     throws Exception 
    { 
     KeyStore  credentials = Utils.createCredentials(); 
     PrivateKey  key = (PrivateKey)credentials.getKey(Utils.END_ENTITY_ALIAS, Utils.KEY_PASSWD); 
    Certificate[] chain = credentials.getCertificateChain(Utils.END_ENTITY_ALIAS); 
    CertStore  certsAndCRLs = CertStore.getInstance("Collection", 
         new CollectionCertStoreParameters(Arrays.asList(chain)), "BC"); 
    X509Certificate cert = (X509Certificate)chain[0]; 

    // set up the generator 
    CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); 

    gen.addSigner(key, cert, CMSSignedDataGenerator.DIGEST_SHA256); 
    gen.addCertificatesAndCRLs(certsAndCRLs); 

    // create the signed-data object 

    CMSProcessable data = new CMSProcessableByteArray("Hello World!".getBytes()); 
    CMSSignedData signed = gen.generate(data, "BC"); 

    // recreate 
    signed = new CMSSignedData(data, signed.getEncoded()); 

    //extract public key 
    CertStore cs = signed.getCertificatesAndCRLs("Collection", "BC"); 



    //signed.signedContent 
    //signed.g 
    CMSProcessable S = signed.getSignedContent(); 
    String aaa = S.getContent().toString(); 
    //byte[] K = Base64.decodeBase64((S.getContent()).toString()); 



    // 
    //String K = Base64.decodeBase64(S.getContent()); 
    //BASE64Decoder.decoder.decodeBuffer() 

    // 
    //byte[] array = asString.getBytes("UTF8"); 
    //String s = new String(array, "UTF8"); 

    // verification step 
    X509Certificate rootCert = (X509Certificate)credentials.getCertificate(Utils.ROOT_ALIAS); 

    if (isValid(signed, rootCert)) 
    { 
     System.out.println("verification succeeded"); 
     //System.out.println(K); 
     //String asString = new String((byte[])data.getContent()); 
     //String asString1 = new String(cs.toString()); 
     //System.out.println(asString); 
     //System.out.println(asString1); 
     //System.out.println(aaa); 
    } 
    else 
    { 
     System.out.println("verification failed"); 
    } 
} 

}

+0

aaa打印什麼? – fatfredyy

+0

aaa打印[B @ fa7e74不是Hello World – user1349407

+0

您嘗試過了:http://www.bouncycastle.org/docs/pkixdocs1.4/org/bouncycastle/cms/CMSSignedDataGenerator.html#generate%28org.bouncycastle.cms。 CMSTypedData%29?因爲pkcs-7可以創建一個分離簽名,這意味着原始數據不包含在簽名中。那麼新的String(aaa)怎麼樣? – fatfredyy

回答

1

您需要使用String aaa = new String(s);,而不是String aaa = S.getContent().toString();雖然你也應該指定編碼,例如String aaa = new String(s, Charset.forName("UTF-8"));。請爲您的toBytes()方法做同樣的事情。

+0

不要爲我工作...... –

+0

@MagnoC這不是一個非常有用的評論......但我會將它添加到我的錯誤錯誤消息列表中。 –

+0

對不起。我會解釋一下:你說我們需要使用'String aaa = new String(s);''s''(小寫)來自哪裏?請澄清你的答案。 –

0

使用new String((byte[])S.getContent());獲得原始內容

相關問題