SHA1withRSA to P7

bcprov-jdk15on-1.55.jar

       	public static  void signPdfByiText(ExternalSignature externalSignature, String pdfFile,String bitmapFilePath, String savePath,int pageIndex, RectF rect,X509Certificate[] chain,List<byte[]>crlBytes,List<byte[]>ocsp, int estimatedSize) throws Exception{
        PdfReader reader = new PdfReader(pdfFile);
        File file = new File(savePath);
        file.delete();
        file.createNewFile();
        FileOutputStream fos = new FileOutputStream(file);
        PdfStamper pdfStamper = PdfStamper.createSignature(reader, fos, '\0', null, true);
        PdfSignatureAppearance sap = pdfStamper.getSignatureAppearance();
        sap.setVisibleSignature(new Rectangle(rect.left, rect.top, rect.right, rect.bottom), pageIndex+1, UUID.randomUUID().toString());
        if(!TextUtils.isEmpty(bitmapFilePath)){
            sap.setSignatureGraphic(com.itextpdf.text.Image.getInstance(bitmapFilePath));
            sap.setRenderingMode(RenderingMode.GRAPHIC);
        }else{
        	sap.setRenderingMode(RenderingMode.DESCRIPTION);
        }

        BouncyCastleDigest externalDigest = new BouncyCastleDigest();
        byte[] ocspData = null;
        if (estimatedSize == 0) {
            estimatedSize = 8192;
            if (crlBytes != null) {
                for (byte[] element : crlBytes) {
                    if(element == null){
                        continue;
                    }
                    estimatedSize += element.length + 10;
                }
            }
            if (ocsp != null) {
                for (byte[] element : ocsp) {
                    if(element == null){
                        continue;
                    }
                    estimatedSize += 4192;
                    ocspData = element;
                }
            }
        }
        String displayData = chain[0].getSubjectDN().toString();
        sap.setCertificate(chain[0]);
        Font font = new Font(BaseFont.createFont(Constant.FONT,BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED));
        sap.setLayer2Font(font);
        sap.setSignatureCreator(StringUtil.getCertDN(displayData, "CN="));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String layer2Text = String.format("%s 签名日期:%s", StringUtil.getCertDN(displayData, "CN="), sdf.format(new Date()));
        sap.setLayer2Text(layer2Text);
        PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKLITE,PdfName.ADBE_PKCS7_SHA1);
        dic.setSignatureCreator(sap.getSignatureCreator());
        dic.setDate(new PdfDate(sap.getSignDate()));
        sap.setCryptoDictionary(dic); 

        HashMap<PdfName, Integer> exc = new HashMap();
        exc.put(PdfName.CONTENTS, new Integer(estimatedSize * 2 + 2));
        sap.preClose(exc);

        String hashAlgorithm = DigestAlgorithms.SHA1;
        PdfPKCS7 sgn = new PdfPKCS7(null, chain, hashAlgorithm, null,
                externalDigest, true);
        InputStream data = sap.getRangeStream();
        byte[] hash = DigestAlgorithms.digest(data,
                externalDigest.getMessageDigest(hashAlgorithm));
        byte[] encodedSig = new byte[0];
        if(ocspData==null&&crlBytes==null){
            byte[] extSignature = externalSignature.sign(hash);
            sgn.setExternalDigest(extSignature, hash,
                    externalSignature.getEncryptionAlgorithm());
            encodedSig = sgn.getEncodedPKCS7(null, null, null,
                    null, CryptoStandard.CMS);
        }else {
            byte[] secondDigest = DigestAlgorithms.digest(new ByteArrayInputStream(hash),
                    externalDigest.getMessageDigest(hashAlgorithm));
            byte[] sh = sgn.getAuthenticatedAttributeBytes(secondDigest, ocspData, crlBytes,
                    CryptoStandard.CMS);
            byte[] extSignature = externalSignature.sign(sh);
            sgn.setExternalDigest(extSignature, hash,
                    externalSignature.getEncryptionAlgorithm());
            encodedSig = sgn.getEncodedPKCS7(secondDigest, null, ocspData,
                    crlBytes, CryptoStandard.CMS);
        }

        if (estimatedSize < encodedSig.length) {
            throw new IOException("Not enough space");
        }
        byte[] paddedSig = new byte[estimatedSize];
        System.arraycopy(encodedSig, 0, paddedSig, 0, encodedSig.length);

        PdfDictionary dic2 = new PdfDictionary();
        dic2.put(PdfName.CONTENTS, new PdfString(paddedSig).setHexWriting(true));
        sap.close(dic2);

    }

转载于:https://my.oschina.net/zdglf/blog/800217

智慧旅游解决方案利用云计算、物联网和移动互联网技术,通过便携终端设备,实现对旅游资源、经济、活动和旅游者信息的智能感知和发布。这种技术的应用旨在提升游客在旅游各个环节的体验,使他们能够轻松获取信息、规划行程、预订票务和安排食宿。智慧旅游平台为旅游管理部门、企业和游客提供服务,包括政策发布、行政管理、景区安全、游客流量统计分析、投诉反馈等。此外,平台还提供广告促销、库存信息、景点介绍、电子门票、社交互动等功能。 智慧旅游的建设规划得到了国家政策的支持,如《国家中长期科技发展规划纲要》和国务院的《关于加快发展旅游业的意见》,这些政策强调了旅游信息服务平台的建设和信息化服务的重要性。随着技术的成熟和政策环境的优化,智慧旅游的时机已经到来。 智慧旅游平台采用SaaS、PaaS和IaaS等云服务模式,提供简化的软件开发、测试和部署环境,实现资源的按需配置和快速部署。这些服务模式支持旅游企业、消费者和管理部门开发高性能、高可扩展的应用服务。平台还整合了旅游信息资源,提供了丰富的旅游产品创意平台和统一的旅游综合信息库。 智慧旅游融合应用面向游客和景区景点主管机构,提供无线城市门户、智能导游、智能门票及优惠券、景区综合安防、车辆及停车场管理等服务。这些应用通过物联网和云计算技术,实现了旅游服务的智能化、个性化和协同化,提高了旅游服务的自由度和信息共享的动态性。 智慧旅游的发展标志着旅游信息化建设的智能化和应用多样化趋势,多种技术和应用交叉渗透至旅游行业的各个方面,预示着全面的智慧旅游时代已经到来。智慧旅游不仅提升了游客的旅游体验,也为旅游管理和服务提供了高效的技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值