pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

java.security.NoSuchAlgorithmException:RSA 簽名不可用

java.security.NoSuchAlgorithmException: RSA Signature not available(java.security.NoSuchAlgorithmException:RSA 簽名不可用)
本文介紹了java.security.NoSuchAlgorithmException:RSA 簽名不可用的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

這是個(gè)例外

<上一頁>線程主"java.security.NoSuchAlgorithmException 中的異常:RSA 簽名不可用在 java.security.Signature.getInstance(Signature.java:229)在 MailClient.main(MailClient.java:52)

這是我的代碼

import java.io.*;導(dǎo)入java.net.*;導(dǎo)入 java.nio.ByteBuffer;導(dǎo)入 java.util.*;導(dǎo)入java.security.*;公共類 MailClient {公共字符串 getMessage(郵件 m){返回 m.message;}公共靜態(tài) void main(String[] args) 拋出異常 {//初始化BufferedReader br = new BufferedReader(new InputStreamReader(System.in));字符串主機(jī) = args[0];int 端口 = Integer.parseInt(args[1]);字符串用戶 ID = args[2];而(真){//連接到服務(wù)器套接字 s = 新套接字(主機(jī),端口);DataInputStream dis = new DataInputStream(s.getInputStream());DataOutputStream dos = new DataOutputStream(s.getOutputStream());ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());oos.flush();ObjectInputStream ois = new ObjectInputStream(s.getInputStream());//待辦事項(xiàng):登錄//這兩行只是為了讓提供的程序運(yùn)行而不會(huì)崩潰.//你可能想改變它們,當(dāng)然在它們之后添加?xùn)|西dos.writeUTF(userid);字符串 userPrivateKeyFileName = 用戶 ID + ".prv";//獲取創(chuàng)建簽名的密鑰ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(userPrivateKeyFileName));PrivateKey privateKey = (PrivateKey)keyIn.readObject();keyIn.close();//創(chuàng)建時(shí)間戳和隨機(jī)數(shù)long t1 = (new Date()).getTime();雙 q1 = Math.random();//ByteBuffer 稍后轉(zhuǎn)換為字節(jié)ByteBuffer bb = ByteBuffer.allocate(16);bb.putLong(t1);bb.putDouble(q1);//創(chuàng)建簽名,使用時(shí)間戳和隨機(jī)數(shù)作為數(shù)據(jù)簽名 sig = Signature.getInstance("RSA");sig.initSign(privateKey);sig.update(bb.array());字節(jié)[] 簽名 = sig.sign();//發(fā)送數(shù)據(jù)和簽名DataOutputStream out = new DataOutputStream(s.getOutputStream());out.writeUTF(userid);out.writeLong(t1);out.writeDouble(q1);out.writeInt(signature.length);out.write(簽名);out.flush();布爾答案 = dis.readBoolean();//通過了驗(yàn)證登錄如果(回答){//接收多少條消息int numMsg = dis.readInt();System.out.println("你有 " + numMsg + " 收到的消息.");//TO DO:閱讀消息ArrayList<郵件>msg = new ArrayList<>(numMsg);for(int i=0;i) ois.readObject();}而(!msg.isEmpty()){//對(duì)于每封郵件,顯示發(fā)件人、時(shí)間戳、消息System.out.println(msg.get(0).sender);System.out.println(msg.get(0).timestamp);System.out.println(msg.get(0).message);MessageDigest md = MessageDigest.getInstance("SHA-1");md.update(msg.get(0).hashcash);字節(jié)[] 摘要 = md.digest();boolean normalMail = msg.get(0).checkHashcash(digest);如果(正常郵件){//檢查每封郵件是否為原始郵件未被修改//接收郵件System.out.println(msg.get(0).message);}else{System.out.println("這是垃圾郵件");System.out.println(msg.get(0).message);}msg.remove(0);}//發(fā)送信息System.out.println("您要發(fā)送消息[Y/N]?");String wantToSend = br.readLine();如果(!wantToSend.equals(Y")){dos.writeBoolean(false);返回 ;}dos.writeBoolean(true);System.out.println("請(qǐng)輸入收件人的用戶名:");字符串接收者 = br.readLine();System.out.println("請(qǐng)輸入您的信息:");字符串消息 = br.readLine();//TO DO:發(fā)送郵件郵件 m = 新郵件(用戶 ID、收件人、郵件);MessageDigest md = MessageDigest.getInstance("SHA-1");md.update(m.hashcash);字節(jié)[] 摘要 = md.digest();而(m.checkHashcash(摘要)){m.setHashcash(摘要);}out.write(摘要);out.flush();//發(fā)送時(shí)間戳和摘要到服務(wù)器長郵件時(shí)間戳 = m.timestamp.getTime();out.writeLong(mailTimestamp);oos.writeObject(m);}}}}

解決方案

如果你運(yùn)行下面的代碼,你會(huì)得到一個(gè)你的Java安裝支持的簽名算法列表.

TreeSet算法=新樹集<>();對(duì)于(提供者提供者:Security.getProviders())對(duì)于(服務(wù)服務(wù):provider.getServices())if (service.getType().equals("簽名"))算法.add(service.getAlgorithm());對(duì)于(字符串算法:算法)System.out.println(算法);

當(dāng)我運(yùn)行它(Windows,Java 1.8.0_65)時(shí),我得到:

MD2withRSAMD5 和 SHA1 和 RSA帶有 RSA 的 MD5NONEwithDSANONEwithECDSANONEwithRSA帶有 DSA 的 SHA1SHA1 和 ECDSASHA1withRSASHA224 和 DSASHA224 和 ECDSASHA224 和 RSA帶有 DSA 的 SHA256SHA256 和 ECDSASHA256 和 RSASHA3??84 和 ECDSASHA3??84 和 RSASHA512 和 ECDSASHA512 和 RSA

如您所見,RSA 不是有效的簽名算法.
也許 NONEwithRSA 是你所追求的?

this is exception

Exception in thread "main" java.security.NoSuchAlgorithmException: RSA Signature not available
    at java.security.Signature.getInstance(Signature.java:229)
    at MailClient.main(MailClient.java:52)

this is my code

import java.io.*;
import java.net.*;
import java.nio.ByteBuffer;
import java.util.*;
import java.security.*;

public class MailClient {

    public String getMessage(Mail m){
        return m.message;
    }

    public static void main(String[] args) throws Exception {

        // Initialisation
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String host = args[0];
        int port = Integer.parseInt(args[1]);
        String userid = args[2];

        while(true) {
            // connect to server
            Socket s = new Socket(host,port);
            DataInputStream dis = new DataInputStream(s.getInputStream());
            DataOutputStream dos = new DataOutputStream(s.getOutputStream());
            ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
            oos.flush();
            ObjectInputStream ois = new ObjectInputStream(s.getInputStream());

            // TO DO: login

            // these two lines are here just to make the supplied programs run without crashing.
            // You may want to change them, and certainly add things after them
            dos.writeUTF(userid);

            String userPrivateKeyFileName = userid + ".prv";
            // Get the key to create the signature
            ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(userPrivateKeyFileName));
            PrivateKey privateKey = (PrivateKey)keyIn.readObject();
            keyIn.close();

            // create timeStamp and random number
            long t1 = (new Date()).getTime();
            double q1 = Math.random();
            // ByteBuffer to convert to bytes later
            ByteBuffer bb = ByteBuffer.allocate(16);
            bb.putLong(t1);
            bb.putDouble(q1);

            // create signature, using timeStamp and random number as data
            Signature sig = Signature.getInstance("RSA");
            sig.initSign(privateKey);
            sig.update(bb.array());
            byte[] signature = sig.sign();

            // send data and signature
            DataOutputStream out = new DataOutputStream(s.getOutputStream());
            out.writeUTF(userid);
            out.writeLong(t1);
            out.writeDouble(q1);
            out.writeInt(signature.length);
            out.write(signature);
            out.flush();

            boolean answer = dis.readBoolean();

            //passed the verifyLogin
            if (answer)
                {
                // receive how many messages
                int numMsg = dis.readInt();
                System.out.println("You have " + numMsg + " incoming messages.");

                // TO DO: read messages
                ArrayList<Mail> msg = new ArrayList<>(numMsg);
                for(int i=0;i<numMsg;i++){
                    //@Unchecked
                    msg = (ArrayList<Mail>) ois.readObject();
                }
                while(!msg.isEmpty()){
                    //for each mail, display sender,timestamp,message
                    System.out.println(msg.get(0).sender);
                    System.out.println(msg.get(0).timestamp);
                    System.out.println(msg.get(0).message);
                    MessageDigest md = MessageDigest.getInstance("SHA-1");
                    md.update(msg.get(0).hashcash);

                    byte[] digest = md.digest();
                    boolean normalMail = msg.get(0).checkHashcash(digest);
                    if(normalMail){
                    //check each mail is original that it isn't modified
                    //receive mail
                        System.out.println(msg.get(0).message);
                        }
                    else{System.out.println("it's a spam message.");
                        System.out.println(msg.get(0).message);
                        }
                    msg.remove(0);
                }


                // send messages
                System.out.println("Do you want to send a message [Y/N]?");
                String wantToSend = br.readLine();
                if (!wantToSend.equals("Y")) {
                    dos.writeBoolean(false);
                    return ;
                }
                dos.writeBoolean(true);

                System.out.println("Enter userid of recipient:");
                String recipient = br.readLine();
                System.out.println("Type your message:");
                String message = br.readLine();

                // TO DO: send mail
                Mail m = new Mail(userid, recipient, message);
                MessageDigest md = MessageDigest.getInstance("SHA-1");
                md.update(m.hashcash);

                byte[] digest = md.digest();
                while(m.checkHashcash(digest)){
                    m.setHashcash(digest);

                }

                out.write(digest);
                out.flush();
                // send timeStamp and digest to server
                long mailTimestamp = m.timestamp.getTime();
                out.writeLong(mailTimestamp);




                oos.writeObject(m);

                }
            }


    }

}

解決方案

If you run the following code, you will get a list of signature algorithms supported by your Java installation.

TreeSet<String> algorithms = new TreeSet<>();
for (Provider provider : Security.getProviders())
    for (Service service : provider.getServices())
        if (service.getType().equals("Signature"))
            algorithms.add(service.getAlgorithm());
for (String algorithm : algorithms)
    System.out.println(algorithm);

When I run it (Windows, Java 1.8.0_65), I get:

MD2withRSA
MD5andSHA1withRSA
MD5withRSA
NONEwithDSA
NONEwithECDSA
NONEwithRSA
SHA1withDSA
SHA1withECDSA
SHA1withRSA
SHA224withDSA
SHA224withECDSA
SHA224withRSA
SHA256withDSA
SHA256withECDSA
SHA256withRSA
SHA384withECDSA
SHA384withRSA
SHA512withECDSA
SHA512withRSA

As you can see, RSA is not a valid signature algorithm.
Maybe NONEwithRSA is what you're after?

這篇關(guān)于java.security.NoSuchAlgorithmException:RSA 簽名不可用的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

Java Remove Duplicates from an Array?(Java從數(shù)組中刪除重復(fù)項(xiàng)?)
How to fix Invocation failed Unexpected Response from Server: Unauthorized in Android studio(如何修復(fù)調(diào)用失敗來自服務(wù)器的意外響應(yīng):在 Android 工作室中未經(jīng)授權(quán))
AES encryption, got extra trash characters in decrypted file(AES 加密,解密文件中有多余的垃圾字符)
AES Error: Given final block not properly padded(AES 錯(cuò)誤:給定的最終塊未正確填充)
Detecting incorrect key using AES/GCM in JAVA(在 JAVA 中使用 AES/GCM 檢測(cè)不正確的密鑰)
AES-256-CBC in Java(Java 中的 AES-256-CBC)
主站蜘蛛池模板: 南京PVC快速门厂家南京快速卷帘门_南京pvc快速门_世界500强企业国内供应商_南京美高门业 | 深圳3D打印服务-3D打印加工-手板模型加工厂-悟空打印坊 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | 桑茶-七彩贝壳桑叶茶 长寿茶 | 背压阀|减压器|不锈钢减压器|减压阀|卫生级背压阀|单向阀|背压阀厂家-上海沃原自控阀门有限公司 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 台湾Apex减速机_APEX行星减速机_台湾精锐减速机厂家代理【现货】-杭州摩森机电 | 充气膜专家-气膜馆-PTFE膜结构-ETFE膜结构-商业街膜结构-奥克金鼎 | 上海公众号开发-公众号代运营公司-做公众号的公司企业服务商-咏熠软件 | 家德利门业,家居安全门,别墅大门 - 安徽家德利门业有限公司 | 挤塑板-XPS挤塑板-挤塑板设备厂家[襄阳欧格] | 蜂蜜瓶-玻璃瓶-玻璃瓶厂-玻璃瓶生产厂家-徐州贵邦玻璃制品有限公司 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 直线模组_滚珠丝杆滑台_模组滑台厂家_万里疆科技 | 施工电梯_齿条货梯_烟囱电梯_物料提升机-河南大诚机械制造有限公司 | 光伏支架成型设备-光伏钢边框设备-光伏设备厂家 | 西子馋火锅鸡加盟-太原市龙城酉鼎餐饮管理有限公司 | 模型公司_模型制作_沙盘模型报价-中国模型网 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 不锈钢水箱厂家,不锈钢保温水箱-山东桑特供水设备| 电力电子产业网 | 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | 软文发布平台 - 云软媒网络软文直编发布营销推广平台 | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 云南标线|昆明划线|道路标线|交通标线-就选云南云路施工公司-云南云路科技有限公司 | 数码管_LED贴片灯_LED数码管厂家-无锡市冠卓电子科技有限公司 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 定量包装秤,吨袋包装称,伸缩溜管,全自动包装秤,码垛机器人,无锡市邦尧机械工程有限公司 | 特种电缆厂家-硅橡胶耐高温电缆-耐低温补偿导线-安徽万邦特种电缆有限公司 | 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 深圳市简易检测技术有限公司| 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 上海租车公司_上海包车_奔驰租赁_上海商务租车_上海谐焕租车 | 济南玻璃安装_济南玻璃门_济南感应门_济南玻璃隔断_济南玻璃门维修_济南镜片安装_济南肯德基门_济南高隔间-济南凯轩鹏宇玻璃有限公司 | 淋巴细胞分离液_口腔医疗器材-精欣华医疗器械(无锡)有限公司 | 聚氨酯复合板保温板厂家_廊坊华宇创新科技有限公司 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 合肥白癜风医院_合肥治疗白癜风医院_合肥看白癜风医院哪家好_合肥华研白癜风医院 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 余姚生活网_余姚论坛_余姚市综合门户网站 | 太阳能发电系统-太阳能逆变器,控制器-河北沐天太阳能科技首页 |