중국시가넷 - 개인 서명 - 소프트웨어에 등록 검증을 추가하려면 어떻게 해야 합니까?
소프트웨어에 등록 검증을 추가하려면 어떻게 해야 합니까?
먼저 등록 코드를 생성하는 알고리즘이 있어야 한다. 다음은 15 자리 등록 코드를 생성하는 간단한 알고리즘입니다.
//이 함수는 CSTRING 유형의 15 자리 등록 코드를 반환하고 포털 매개 변수는 사용자 이름입니다.
Cstring getregpasswd (cstring & 디렉토리 이름)
{
//사용자 이름을 15 자리 등록 코드로 변환합니다.
Long Num 1, Num2, Num3
Charsn [16] = {0};
CString p;;
Int I, len
Num1= 0;
Num2 = 0;
Num3 = 0;
Len = int (strlen (dirname));
만약 (len! =0)
{
For (I =1; 나<= leni++)
{
//1 단계 알고리즘
Num1= (long (num1+(int (dirname [I-1]) * I *;
//2 단계 알고리즘
Num2 = (num2 * I+(long (pow ((int) dirname [I-1], 2) * I))%/
//3 단계 알고리즘
Num3 = (num2+(long) sqrt (num1)%100000;
}
//세 알고리즘의 결과를 사용하여 5 자를 생성했으며 15 * * 가 있습니다.
For(I = 0;; 나<5; I++)
Sn [I] = (int) (num1+31+I * I * I)%128;
For(I = 5;; 나< 10; I++)
Sn [I] = (int) (num 2+31+I * I * I * I)%128;
For (I =10; 나< 15; I++)
Sn [I] = (int) (num 3+31+I * I * I * I)%128;
Sn [15] = 0;
//아래의 루프는 생성된 모든 문자를 0-9, A-Z, a-z 로 변환합니다.
For(I = 0;; 나< 15; I++)
{
While ((sn [I] < 0' | | sn [I] > 9 ')& amp;; & amp (sn [I] < A' | | sn [I] > z') & & amp (sn [I] < A' || sn[i]>z'))
{
Sn [I] = (sn [I]+31+7 * I)%128;
}
}
//함수 반환 값으로 사용할 CSTRING 변수에 값을 지정합니다.
페이지 (페이지 약어) 형식 ("%s", 일련 번호);
}
P 를 반환합니다
}
//함수는 소프트웨어가 등록되어 있는지 확인합니다.
BOOL GetRegFlag(void)
{
HKEY hKey = NULL;;
바이트 I;
CString 문자열;
해협. Loadstring (ids _ reg _ key); // IDS_REG_KEY 는 레지스트리의 하위 디렉토리 문자열입니다.
If (RegCreateKey(HKEY 현재 사용자, 문자열, & amphKey)! = ERROR_SUCCESS) false 를 반환합니다
데보 cbA
Cba = sizeof (int);
If( RegQueryValueEx(hKey, "SzMima", NULL, NULL & amp;; 나 & ampcbA)! = 오류 _ 성공)
False 를 반환합니다
바이트 j = I;;
If(j==0)//0 은 소프트웨어가 등록되어 제대로 작동한다는 의미입니다.
{
RegCloseKey(hKey););
True 를 반환합니다
}
기타
{
RegCloseKey(hKey););
False 를 반환합니다
}
False 를 반환합니다
}
//소프트웨어 등록 플래그의 함수를 설정합니다.
BOOL SetRegFlag(void)
{
HKEY hKey = NULL;;
바이트 I;
CString 문자열;
해협. Loadstring (ids _ reg _ key); // IDS_REG_KEY 는 레지스트리의 하위 디렉토리 문자열입니다.
If (RegCreateKey(HKEY 현재 사용자, 문자열, & amphKey)! = ERROR_SUCCESS) false 를 반환합니다
바이트 j = 0;; //0 은 등록되었음을 나타냅니다.
If(RegSetValueEx(hKey, "SzMima", 0, REG_BINARY, & ampj, 4)! = 오류 _ 성공)
{
AfxMessageBox ("레지스트리 데이터를 설정할 수 없습니다!" " );
FALSE 를 반환합니다
}
False 를 반환합니다
}
위의 세 가지 함수는 프로그램 초기화 시 다음 코드만 추가하면 되는 소프트웨어 등록 메커니즘을 구현합니다.
Boolbreg = getregflag ();
만약 (! BReg) 를 참조하십시오
{
//여기에 제한 함수를 추가하거나 사용을 거부하는 코드를 추가하십시오.
}
사용자가 등록할 경우 다음 코드만 추가하면 됩니다.
//이것은 내 프로그램의 등록 인터페이스입니다. 사용자 이름과 코드를 입력하고 제출한 후 등록 코드가 정확한지 확인합니다.
Void CRegEdit::OnBnClickedOk ()
{
만약 (! UpdateData ()) 가 반환됩니다. //편집 상자의 내용을 가져와서 클래스 변수에 할당합니다.
M _ 레거스. Trimleft (); //m_RegUser 는 사용자 이름입니다.
M _ 레거스. Trimright ();
If(m_RegUser) 입니다. IsEmpty ())
{
AfxMessageBox ("사용자 이름은 비워 둘 수 없습니다. 다시 입력하십시오." " );
Getdlgitem (IDC _ reguser)-> Setfocus ();
반환;
}
M_RegPasswd 입니다. Trimleft (); M_RegPasswd 는 등록 코드입니다.
M_RegPasswd 입니다. Trimright ();
If(m_RegPasswd. IsEmpty ())
{
AfxMessageBox ("등록 코드는 비워 둘 수 없습니다. 다시 입력하십시오." " );
Getdlgitem (IDC _ regpasswd)-> Setfocus ();
반환;
}
CString Passwd
Passwd = getregpasswd (m _ reguser); //알고리즘을 호출하여 사용자 이름의 등록 코드를 가져옵니다.
If(Passwd==m_RegPasswd)// 사용자가 입력한 등록과 비교합니다.
{
Setregflag (); //등록 플래그 설정
Onok ();
}
기타
AfxMessageBox ("등록 코드가 잘못되었습니다. 다시 입력하십시오." " );
Updatedata (false);
}
RSA 는 소프트웨어 등록 기능을 수행합니다. 키를 크게 설정하면 기본적으로 다른 사람이 레지스트라를 쓸 수 없지만, 다른 사람이 당신의 프로그램을 해독하는 것을 막는 것은 다른 문제입니다.
수입 시스템. 안전합니다. 암호술
수입 시스템. 텍스트
수입 시스템. 초정형 이미지 튜브 (Image Orthicon)
수입 시스템. 확장 가능한 마크 업 언어
공용 클래스 FrmReg
시스템을 상속하다. 창. 폼. 폼
Dim xmlKeys 는' 공개 키와 개인 키의 조합' 문자열입니다
Dim xmlPublicKey As String' 공개 키만
' 바이트 배열의 일반 텍스트 메시지
Dim PlainTextBArray As Byte ()
바이트 배열의 암호문 메시지
Dim CypherTextBArray As Byte ()
# region "Windows 양식 디자이너에 의해 생성된 코드"
공용 자식 새 ()
내 기지. 새로 만들기 ()
이 호출은 Windows 양식 디자이너에 필요합니다.
InitializeComponent ()
InitializeComponent () 호출 후 초기화를 추가합니다.
끝단 접합
양식은 dispose 를 다시 작성하여 구성 요소 목록을 정리합니다.
보호된 오버로드 재정의 Sub Dispose(ByVal Dispose 는 Boolean)
그리고
그렇지 않다면 (구성 요소는 아무것도 아님)
구성 요소. 처분 ()
만약 ... 끝날거야
만약 ... 끝날거야
내 기지. 처분 (처분)
끝단 접합
Windows 양식 디자이너에 필요합니다.
개인 구성 요소는 시스템으로 사용됩니다. ComponentModel.IContainer
참고: 다음 절차는 Windows 양식 디자이너에 필요합니다.
Windows 양식 디자이너를 사용하여 이 프로세스를 수정할 수 있습니다.
코드 편집기를 사용하여 수정하지 마십시오.
사건 btnReg 를 시스템의 친구로 삼다. 창. 폼. 단추
이벤트 btnexit 를 시스템의 친구로 삼다. 창. 폼. 단추
Friend WithEvents Label 1 은 시스템입니다. 창. 폼. 레이블
이벤트 태그 2 를 시스템의 친구로 사용합니다. 창. 폼. 레이블
친구는 이벤트 txtRegCode 를 시스템으로 한다. Windows.Forms.TextBox
친구는 이벤트 txtRegName 을 시스템으로 사용합니다. Windows.Forms.TextBox
친구 WithEvents LinkLabel 1 은 시스템입니다. Windows.Forms.LinkLabel
개인 Sub InitializeComponent ()
Me.btnReg = 새 시스템. 창. 폼. 단추
Me.btnexit = 새 시스템. 창. 폼. 단추
Me.txtRegName = 새 시스템. Windows.Forms.TextBox
나. Label 1 = 새 시스템. 창. 폼. 레이블
나. Label2 = 새 시스템. 창. 폼. 레이블
Me.txtRegCode = 새 시스템. Windows.Forms.TextBox
나. LinkLabel 1 = 새 시스템. Windows.Forms.LinkLabel
나. 레이아웃을 일시 중지합니다 ()
`
BtnReg
`
Me.btnReg.FlatStyle = System 입니다. Windows.Forms.FlatStyle.Flat
Me.btnReg.Location = 새 시스템. 도면 점 (64, 192)
Me.btnReg.Name = "btnReg "
Me.btnReg.Size = 새 시스템. 도면. 사이즈 (75,24)
Me.btnReg.TabIndex = 0
Me.btnreg.text = "register (&; R) "
`
Btnexit
`
Me.btnexit.FlatStyle = System 입니다. Windows.Forms.FlatStyle.Flat
Me.btnexit.Location = 새 시스템. 도면 시트 점 (168, 192)
Me.btnexit.Name = "btnexit "
Me.btnexit.Size = 새 시스템. 도면. 사이즈 (75,24)
Me.btnexit.TabIndex = 1
Me.btnexit.text = "cancel (&; C) "
`
TxtRegName
`
Me.txtRegName.Location = 새 시스템. 도면 점 (8,24)
Me.txtRegName.Name = "txtRegName "
Me.txtRegName.Size = 새 시스템. 시트. 치수 (296, 2 1)
Me.txtRegName.TabIndex = 2
Me.txtRegName.Text = ""
`
태그 1
`
나. 레이블1입니다. 위치 = 새 시스템. 도면 점 (8,0)
나. 레이블1입니다. Name = "레이블1"
나. 레이블1입니다. 크기 = 새 시스템. 용지 크기 (48, 16)
나. 레이블1입니다. TabIndex = 3
나. 레이블1입니다. Text = "등록 이름:"
`
태그 2
`
나. 태그 2. 위치 = 새 시스템. 도면 점 (8,56)
나. Label2.Name = "Label2 "
나. Label2.Size = 새 시스템. 용지 크기 (56, 16)
나. Label2.TabIndex = 4
나. Label2.Text = "등록 코드:"
`
TxtRegCode
`
Me.txtRegCode.Location = 새 시스템. 도면 점 (8,80)
Me.txtRegCode.Multiline = True
Me.txtRegCode.Name = "txtRegCode "
Me.txtRegCode.Size = 새 시스템. 용지 크기 (296, 104)
Me.txtRegCode.TabIndex = 5
Me.txtRegCode.Text = ""
`
LinkLabel 1
`
나. LinkLabel 1 입니다. 위치 = 새 시스템. 도면 점 (128,56)
나. LinkLabel 1 입니다. Name = "LinkLabel 1 "
나. LinkLabel 1 입니다. 크기 = 새 시스템. 시트. 치수 (128, 16)
나. LinkLabel 1 입니다. TabIndex = 6
나. LinkLabel 1 입니다. TabStop = True
나. LinkLabel 1 입니다. 텍스트 = ""
나. TopMost = True
나. ResumeLayout(False)
끝단 접합
# 끝 영역
Private subbtn exit _ click (byval sender as system). 객체, ByVal e 를 시스템으로 사용합니다. 이벤트) 는 btnexit 를 처리합니다. 클릭
신청하다. 종료 ()
끝단 접합
Private subbtn reg _ click (byval sender as system). 객체, ByVal e 를 시스템으로 사용합니다. EventArgs) 는 btnReg 를 처리합니다. 클릭
TxtRegName 인 경우. Text = ""그럼
MessageBox 입니다. 표시 ("등록 이름은 비워 둘 수 없습니다", "프롬프트")
돌아오다
기타
TxtRegCode 인 경우. Text = ""그럼
MessageBox 입니다. 표시 ("등록 코드는 비워 둘 수 없습니다", "힌트")
돌아오다
기타
TxtRegCode 인 경우. 텍스트 길이<& gt 그럼 172
MessageBox 입니다. 표시 ("잘못된 등록 코드 길이", "프롬프트")
돌아오다
만약 ... 끝날거야
만약 ... 끝날거야
만약 ... 끝날거야
시도하다
Dim RSA As 시스템. Security.cryptography.rsacryptoserviceprovider = 새 시스템. Security.cryptography.rsacryptoserviceprovider
공개 키
RSA. From XML string ("xzalwaoqecj 8 jwrkxyaecahyz 9w+wh 26k8 zcmv 9 zfydjerjmhk 7 Ahn bwn+q1mah7vv/kloc- 46v 6s 2s ljeerevtxs 3dj r0 pj aed 0r2 JSF 0fw rwp 6 cdskreqc 803e+faaw/kou134k6 me jpg16 dxyfcile
Dim RS deformat As 시스템. Security.cryptography.rsa pkcs1signaturedeformator = new system. Security.cryptography.rsa pkcs1signature formatter (RSA)
암호 해독을 지정할 때 해시 알고리즘은 MD5 입니다.
RSADeformatter 입니다. SetHashAlgorithm("MD5 ")
Dim Regcode As Byte() = Convert. FromBase64String(txtRegCode). 본문)
Dim RegName As Byte() = (새 시스템. 텍스트. ASCIIEncoding) 을 참조하십시오. GetBytes(txtRegName). 본문)
Dim dataToHash As Byte() = (새 시스템. 텍스트. ASCIIEncoding) 을 참조하십시오. GetBytes(txtRegName). 본문)
Dimhash asbyte () = ctype (시스템). Security.cryptography.cryptoconfig.createfromname ("MD5"), System. Security.cryptography.hash algorithm) 을 참조하십시오. 해시 계산 (데이터 해시)
서명을 확인합니다
RSADeformatter 인 경우. 그런 다음 서명 확인 (해시, 레지스트리 코드)
신청이 통과되면 등록 서류에 쓸 것이다.
Dimtext writer as xmltext writer = new xmltext writer ("reg.xml", Nothing)
문자 작가. WriteStartElement("RegInfo ")
문자 작가. WriteStartElement("RegName ")
문자 작가. WriteString(txtRegName). 본문)
문자 작가. WriteEndElement ()
문자 작가. WriteStartElement("RegCode ")
문자 작가. WriteString(txtRegCode). 본문)
문자 작가. WriteEndElement ()
문자 작가. 닫기 ()
MessageBox 입니다. 표시 ("등록이 정확합니다. 소프트웨어를 등록해 주셔서 감사합니다. 프로그램을 다시 시작하여 등록을 완료하십시오.", "힌트")
신청하다. 종료 ()
기타
MessageBox 입니다. 표시 ("등록 코드 오류", "프롬프트")
만약 ... 끝날거야
Ex 를 예외 캡처로 사용
MessageBox 입니다. 표시 (예: Message ())
MessageBox 입니다. 표시 ("등록 코드 오류", "프롬프트")
시도를 마치다
끝단 접합
Private sub frmreg _ closed (byval sender 는 객체로, ByVal e 는 시스템으로. 이벤트) 는 MyBase 를 처리합니다. 닫힌
신청하다. 종료 ()
끝단 접합
개인 하위 linklabel1_ linkclicked (byval sender as system). 객체, ByVal e 를 시스템으로 사용합니다. Windows.forms.linklabelinkclickedeventargs) LinkLabel 1 을 처리합니다. 링크가 클릭되었습니다
시스템. Diagnostics.Process.Start ("") 를 참조하십시오
끝단 접합
종료 클래스
- 관련 기사