自定義java工具類讀取DER格式資料

2021-07-25 21:59:30 字數 2130 閱讀 7359

在證書編碼中,主要使用的是兩種編碼結構,乙個是pem編碼,另一種就是der編碼( distinguished encoding rules,可辨別編碼規則 )。而der編碼同時也是asn.1(抽象語法標記)的乙個子集。

本篇就簡單的對乙個der格式的檔案進行解析,並介紹相應的工具類。

建立乙個工具類,類名就是deranalysis,建立構造方法:

public

deranalysis(byte abyte)

在構造方法中將資料進行初始化,儲存資料的長度及預設偏移位和資料指定位,其中資料指定位指的是可以再次宣告構造方法,將資料指定區域向後偏移一定的長度,這屬於對當前類的擴充套件了,就不做說明了。

parsecurrentdata方法:

private

boolean

parsecurrentdata()

// 如果指定位置+1 位大於等於 0x81 (也就是表示長度位 是一位還是二位 )

while (this.mcurdatalength + this.mcurdataoffset <= this.mtlvoffset + this.mobjlength)

//如果 mcuroffset + 1 位 是0x82 ,長度是二個位元組表示

if ((0xff & this.mrecord[(1 + this.mcuroffset)]) == 130)

break;}}

return

false;

}catch (arrayindexoutofbound***ception localarrayindexoutofbound***ception)

}

當前方法是將der格式的資料進行相應解析,重點是將資料位及資料長度位的指定索引進行讀取。從上述方法中,可以看出,我只做了長度位在兩個位元組以內的檔案進行判斷,因為在一般的證書檔案中,長度位一般都不會超過2個位元組,要知道2個位元組的長度就達到65535位元組了。

同時,在der格式標準中,長度位是高位優先的,所以在計算長度的時候將首位進行向左位移8位。

對外提供的方法:

資料長度區域索引、資料區域索引都已經找到了。就只需要提供幾個方法,將解析的結果對外暴露了。

isdir:

public

boolean

isdir()

這個方法在解析時,是第乙個被呼叫的,先判斷是否滿足der結構,否則就不要進行下去了。

gettag:

public

intgettag()

此方法是獲取物件識別符號資料,在當前類中,我預設標記位都只是乙個位元組,如果各位的需求文件中表明不止乙個位元組表明物件識別符號,那麼就需要進行相應的修改了,這裡只是作為乙個基本的寫法,就不擴充套件了。

拿到物件識別符號進行判斷是否和認為的識別符號一樣,如果一樣就可以提取資料了。

getdata:

public

byte getdata()

else else

return abyte1 != null ? abyte1 : abyte0;

}catch (exception e)

}}

此方法就是獲取資料的方法,在方法中會有個判斷,如果獲取到的資料域第乙個資料是0x00,那麼認為此位元組是補位的,並非是真正的資料,所以從此位元組之後的資料進行提取。

在der解析時,資料域不可能只有乙個資料塊的,所以需要進行下乙個資料塊的解析,如果從工具類外部進行操作的話,顯得很是冗餘,所以應該在工具類中進行下乙個資料塊的解析。

nextobject:

public

boolean

nextobject()

執行此方法,將資料偏移向後,便可以開始下乙個資料塊的解析了。具體的方法還是按照上述提供的方法。

在工具類進行解析der格式資料的時候,在同乙個層級的資料塊向後解析時,呼叫的是nextobject方法,而如果是當前資料塊中包含其他的資料塊,如果是這種結構,就需要重新將獲取到的資料(getdata方法)作為新的要解析的資料,重新執行構造方法了。

上述便是簡單解析der格式資料的工具類說明,**比較簡單,所需要的是要對der格式檔案有一定的了解。如果需要擴充套件請自行定義。

JAVA自定義類

下面看乙個簡單的bankcard類 public class bankcard public int getpasswd public void setpasswd int passwd more methods 從構造器開始 public bankcard int id,int passwd 1....

Java 自定義隨機數工具類

最近大部分精力都投入到公司系統的重構上,經歷了幾波人之手的 改起來真是苦不堪言。原本的 當中,很多地方都有產生隨機數這一項,但是都各有各的寫法,十分不統一。想了想還是統一寫個隨機數工具類來解決,也方便後期的呼叫。隨機數工具類 created by zhh on 2017 08 01.public c...

自定義日誌工具類

import android.util.log public class logutil public static void d string tag,string msg public static void i string tag,string msg public static void ...