从签名内容java中读取原始数据
我想从签名内容中提取原始数据 在以下代码中,签名的数据是“CMSSignedData signed” 我从StackOverflow中找到了几个类似的答案,但所有答案都不可能 说明如何从签名内容中提取原始数据 问候从签名内容java中读取原始数据,java,x509,Java,X509,我想从签名内容中提取原始数据 在以下代码中,签名的数据是“CMSSignedData signed” 我从StackOverflow中找到了几个类似的答案,但所有答案都不可能 说明如何从签名内容中提取原始数据 问候 package chapter9; import java.security.KeyStore; import java.security.PrivateKey; import java.security.cert.*; import java.util.Arrays; impo
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");
}
}
}您需要使用
字符串aaa=新字符串
而不是字符串aaa=S.getContent().toString()
虽然您也应该指定编码,例如stringaaa=newstring(s,Charset.forName(“UTF-8”)代码>。请对您的toBytes()
方法执行相同操作。使用新字符串((byte[])S.getContent()
获取原始内容aaa打印[B@fa7e74您是否尝试过:?因为pkcs-7可以创建分离的签名,这意味着签名中不包含原始数据..那么新字符串(aaa)如何?@user1349407“[B@fa7e74"看起来像字节数组的toString输出。您是否尝试打印/记录S.getContent()的类?像这样将toString应用于该对象可能会丢弃任何内容,例如,如果该对象是数组。如果该类被证明是字节[],则,打印各个字节以检查它们是否表示您期望的数据。@MagnoC这不是一个非常有用的注释…但我会将其添加到错误错误消息列表中。抱歉。我会解释:您说过我们需要使用String aaa=新字符串;
但是s
(小写)来自何处?请澄清您的答案。@MagnoC我想我自动将大写字母S转换为小写字母S,正如Java编码标准所示。是的,但我不能将CMSProcessable
(S)转换为String
。