密碼學中常用的概念
消息摘要
這是壹種與消息認證碼相結合的技術,以確保消息的完整性。它主要使用單向哈希函數算法,可用於檢查消息的完整性,並通過哈希密碼直接以文本形式保存。目前,MD MD SHA jdk為上述所有內容提供支持。在java中對消息進行摘要非常簡單,java安全消息摘要提供了壹種簡單的操作方法。
/**?*MessageDigestExample java?*版權?*/?導入java安全消息摘要;?/**?*單個消息摘要算法可用於隱藏和保存明文消息(如密碼),而無需使用密碼?*/?公共類MessageDigestExample{?公共靜態void main(String【】args)引發異常{?if(args長度!= ){?System err println(用法:Java MessageDigestExample text);?系統出口();?}
byte【】platext = args【】getBytes(UTF);
//使用getInstance(算法)獲取消息摘要。這裏用SHA的位算法嗎?message digest message digest = message digest getInstance(SHA);
system out println(\ n+message digest get provider()getInfo());?//開始使用算法?messageDigest更新(明文);?系統輸出println(\ n digest:);?//輸出算法運算的結果?系統輸出println(新字符串(message digest digest()UTF);?}?}?也可以通過消息認證碼進行加密,javax crypto Mac提供了壹種解決方案。有興趣者可參考相關API文件。本文僅簡要介紹什麽是摘要算法。
下面是使用消息摘要加密的另壹個示例:公共類TestEncrypt {
public testen crypt(){?}
/* * * @ param str RC:str RC是將被加密的字符串* @param encName : encName是將被使用的算法名稱*?encName默認為MD * @return String */?公共字符串加密(String strrc String encName ){
MessageDigest md = null?String strDes = null
byte【】Bt = strrc getBytes();?嘗試{?if(encName = = null | | encName equals()){?encName = MD?}?MD = message digest getInstance(enc name);?md更新(Bt);?strDes = bytes Hex(MD digest());//到HexString?}?catch(nosuchalgorithm exception e){?系統輸出println(無效算法);?返回null?}?返回strDes?}
公共字符串字節十六進制(byte【】BTS){?string des =;?String tmp = null?for(int I =;我& ltbts長度;i++){?tmp =(Integer to hex string(BTS【I】& amp;xFF));?if(tmp length()= =){?des+=;?}?des+= tmp;?}?返回des?}
public static void main(String【】args){?testen crypt te = new testen crypt();?String strSrc =可以加密漢字哦和英文;?系統輸出println(源字符串:+str src);?系統輸出println(加密字符串:);?系統輸出println(使用Def:+te Encrypt(strrc null));?系統輸出println(使用MD:+te Encrypt(strrc MD));?系統輸出println(使用SHA:+te Encrypt(strrc SHA));?系統輸出println(使用SHA:+te Encrypt(strrc SHA));?}?}
此外,javawebparts中RequestHelpers中的generateGUID方法還涉及MD方法代碼,如下所示:?公共靜態字符串generate guid(http servlet request請求){
string out =;?嘗試{?//構造壹個包含以下內容的字符串:?//遠程IP地址+主機IP地址+日期(yyyyMMdd)+?//時間(hhmmsssa)+請求的路徑+會話ID +?//參數映射的HashCode?string buffer * * * = new string buffer();?* * * append(request getremote addr());?InetAddress ia = InetAddress getLocalHost();?* * * append(ia getHostAddress());?* * * append(new simple Date format(yyyymmdd hhmmsssa)格式(new Date());?string path = request getServletPath();?string pathInfo = request getPathInfo();?if(pathInfo!= null){?path+= pathInfo;?}?*** append(路徑);?* * * append(request getSession(false));?* * * append(request getParameterMap()hashCode());?string str = * * * toString();?//現在使用MD加密算法對字符串進行編碼?message digest MD = message digest getInstance(MD);?MD update(str getBytes());?byte【】digest = MD digest();?string buffer hextr = new string buffer();?for(int I =;我& lt摘要長度;i++){?str = Integer to hex string(xFF & amp;digest【I】);?if(str length()& lt;) {?str =+str;?}?hextr append(str);?}?out = hextr toString();?} catch(nosuch algorithm exception nsae){?日誌錯誤(nsae);?} catch(UnknownHostException uhe){?對數誤差(uhe);?}?//返回加密字符串,它應該是唯壹的。//替換純文本字符串並且應該始終替換的組件。//字符感謝MD算法?返回出去;
} // End generateGUID()
私有密鑰加密
消息摘要只能檢查消息的完整性,但不能單向加密明文消息。如果我們想加密明文消息,我們必須使用其他算法。為了確保機密性,我們需要使用私鑰加密來交換私人消息。
最好通過使用對稱算法來理解這壹點,例如A用密鑰加密文件,B讀取文件,這需要與A擁有相同密鑰的雙方共享壹個私鑰(並且私鑰在web環境中傳輸時很容易被截獲)。
要用私鑰加密,您首先需要壹個密鑰。您可以使用javax crypto KeyGenerator生成壹個密鑰(java安全密鑰),然後將其傳遞給加密工具(JavaX Crypto Crypto)。然後該工具使用相應的算法進行加密。主要的對稱算法是DES(實際的密鑰只有位)和AES(支持三個密鑰長度位)。通常,第壹位和其他jdk類型(如DESede)也提供對對稱算法的支持。以下示例使用AES算法進行加密。
/**?* PrivateExmaple java?*版權?*/?導入javax加密密碼;?導入javax加密密鑰生成器;?導入java安全密鑰;
/**?*私人加密確保消息的機密性?*/?公共類PrivateExample{?公共靜態void main(String【】args)引發異常{?if(args長度!= ){?系統錯誤println(用法:java PrivateExample & lt文本& gt);?系統出口();?}?byte【】platext = args【】getBytes(UTF);
//通過KeyGenerator形成密鑰?system out println(\ n start生成AES密鑰);?key generator key gen = key generator getInstance(AES);?key gen init();?key key = key gen generate key();?系統輸出println(完成生成DES密鑰);
//獲取私有加密類密碼ECB是加密方法還是PKCS填充方法?密碼密碼=密碼getInstance(AES/ECB/PKCS填充);?system out println(\ n+cipher get provider()getInfo());
//使用私有加密?系統輸出println(\ n啟動加密:);?密碼初始化(密碼加密模式密鑰);?byte【】密文=cipher doFinal(明文);?系統輸出println(完成加密:);?系統輸出println(新字符串(密文UTF));
系統輸出println(\ n start解密:);?密碼初始化(密碼解密模式密鑰);?byte【】new plaintext = cipher do final(密文);?系統輸出println(完成解密:);
系統輸出println(新字符串(新明文UTF));
}?}
)公鑰加密
如上所述,私鑰加密需要* * *共享的密鑰,那麽如何傳輸密鑰呢?如果在web環境下直接傳輸,很容易被截獲。幸運的是,隨著公鑰加密的出現,公鑰加密也稱為非對稱加密。非對稱算法使用壹對密鑰來配對公鑰和私鑰。只有私鑰可以解密用公鑰(可用於加密)加密的數據。同時,只有公鑰才能解密用私鑰(簽名)加密的數據,但速度非常慢(比私鑰加密慢壹倍)。公鑰的主要算法包括RSA和jdk,如Blowfish Diffie Helman,它為RSA提供了支持,是壹種改進。
/**?*公共示例java?*版權?*/?導入java安全密鑰;?導入javax加密密碼;?導入java安全密鑰對生成器;?導入java安全密鑰對;?/**?*公開加密的壹個簡單例子。Cipher類使用由KeyPairGenerator生成的公共和私有密碼。*/?公共類PublicExample{?公共靜態void main(String【】args)引發異常{?if(args長度!= ){?系統錯誤println(用法:java PublicExample & lt文本& gt);?系統出口();?}
byte【】platext = args【】getBytes(UTF);?//形成壹個RSA密鑰?system out println(\ n開始生成RSA密鑰);?KeyPairGenerator keyGen = KeyPairGenerator getInstance(RSA);?keyGen initialize();?key pair key = keyGen generate key pair();?系統輸出println(完成生成RSA密鑰);
//使用公共加密獲取RSA密碼類?密碼密碼=密碼getInstance(RSA/ECB/PKCS填充);?system out println(\ n+cipher get provider()getInfo());
system out println(\ nStart encryption);?Cipher init(Cipher ENCRYPT _ MODE key getPublic());?byte【】密文=cipher doFinal(明文);?系統輸出println(完成加密:);?系統輸出println(新字符串(密文UTF));
lishixinzhi/Article/program/Java/hx/201311/26898