DE69604307T2 - Kodierungstechnik für software - Google Patents

Kodierungstechnik für software

Info

Publication number
DE69604307T2
DE69604307T2 DE69604307T DE69604307T DE69604307T2 DE 69604307 T2 DE69604307 T2 DE 69604307T2 DE 69604307 T DE69604307 T DE 69604307T DE 69604307 T DE69604307 T DE 69604307T DE 69604307 T2 DE69604307 T2 DE 69604307T2
Authority
DE
Germany
Prior art keywords
program
executable program
cascades
clock
encoding
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime
Application number
DE69604307T
Other languages
English (en)
Other versions
DE69604307D1 (de
Inventor
Becky Chan
Stanley Chow
Yuan Gu
Harold Johnson
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nortel Networks Ltd
Original Assignee
Nortel Networks Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nortel Networks Corp filed Critical Nortel Networks Corp
Publication of DE69604307D1 publication Critical patent/DE69604307D1/de
Application granted granted Critical
Publication of DE69604307T2 publication Critical patent/DE69604307T2/de
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/08Error detection or correction by redundancy in data representation, e.g. by using checking codes
    • G06F11/10Adding special bits or symbols to the coded information, e.g. parity check, casting out 9's or 11's

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Storage Device Security (AREA)

Description

    Technisches Gebiet und gewerbliche Anwendbarkeit
  • Die vorliegende Erfindung betrifft allgemein ein Aufbauverfahren für Software-Programme oder Hardware-Entwicklungen, bei dem die enthaltene Intelligenz vor der Entdeckung oder Nachahmung bzw. Fälschung geschützt ist. Insbesondere wird ein ausführbarer Programmentwurf bzw. ein ausführbares Programm durch das Verfahren des Kaskadierens und Verschachtelns oder Verwebens, zusätzlich zur periodischen Prüf-Code-Einfügung, kodiert, so daß das kodierte Programm geschützt ist, jedoch ausführbar bleibt.
  • Ausgangspunkt
  • Die Notwendigkeit in Software-Programmen und Hardware-Entwicklungen enthaltene Informationen zu schützen, oder einen Nachahm-Schutz vorzusehen, ist nicht neu. Es wurden viele Mechanismen angewendet, um diese Ziele zu erreichen.
  • In dem Artikel mit dem Titel "Operating System Protection Through Program Evaluation" von F. B. Cohen in Computer & Security, Bd. 12, (1993), S. 565-584 wird ein derartiger Mechanismus vorgeschlagen. Der Angriff auf und die Verteidigung von einem Computer-Betriebs-System wird wie folgt beschrieben:
  • "Einer der Hauptfaktoren für die erfolgreiche Anwendung von Informations-Schutztechniken besteht in der Ausnutzung bzw. Gewinnung Computer-Rechenvorteils. Der Rechenvorteil stammt historisch aus der Chiffrierung, wobei die Shannon's Theorie deutlich den Effekt der "Arbeitslast" auf die Komplexität der Verschlüsselungsanalyse zeigt und die Konzepte der Zerstreung und Konfusion vorstellt, welche mit den statistischen Angriffen auf Verschlüsselungssysteme in Verbindung stehen. Die meisten modernen Verschlüsse lungssysteme setzen diese als ihre Hauptverteidigung ein. Das gleiche Grundprinzip trifft auf Computer-Virus-Analysen zu, bei denen evolutionäre Viren die Kompliziertheit der Erkennung und Ausrottung dramatisch erhöhen, und. auf den Paßwortschutz, bei dem wir versuchen die Anzahl der für einen erfolgreichen Angriff erforderlichen Versuche zu erhöhen, indem die Verwendung von naheliegenden Paßwörtern eingeschränkt wird. Einer der Hauptgründe für erfolgreiche Angriffe liegt in der statischen Natur der Verteidigung und der dynamischen Natur des Angriffs." (S. 565)
  • "Der ultimative Angriff gegen irgendein System beginnt mit dem physikalischen Zugang und fährt mit der Technik des Entfernens und Umkehrens von irgendwelchen in diesem Fall programmierten Verteidigungsmitteln fort. Selbst wenn ein kryptographischer Schlüssel durch den Anwender vorgesehen wurde, kann ein Angreifer diesen Mechanismus herausfinden und den Schlüssel anwenden, wodurch er umfassenden physikalischen Zugriff erhält. Schließlich kann der Angreifer die Verteidigungsmittel entfernen, indem er Entscheidungspunkte auffindet und diese ändert, um veränderte Entscheidungen zu erzielen." (S. 565-66)
  • "Ohne einen physikalischen Schutz vorzusehen, hat bisher niemand ein Verteidigungsmittel gegen diesen Angriff gefunden, und es ist unwahrscheinlich, daß dies jemals irgendjemand gelingen wird. Der Grund dafür besteht darin, daß jedes andere als ein physikalisches Schutzsystem von dem Betrieb einer endlichen Zustandsmaschine (finite state machine) abhängt, und letztendlich jede endliche Zustandsmaschine überprüft und nach Belieben verändert werden kann, wenn bei ausreichend zur Verfügung stehender Zeit entsprechende Anstrengungen unternommen werden. Das Beste, das wir unternehmen können, um einen Angriff zu verzögern, ist den Aufwand für die Durchführung der gewünschten Veränderungen zu erhöhen. (S. 566)
  • "Die ultimative Verteidigung besteht darin, den Aufwand für den ultimativen Angriff so weit zu erhöhen, daß die für den Angriff erforderlichen Kosten diesen nicht lohnen. Im Ergebnis bedeutet dies Sicherheit durch Undurchschaubarkeit, und es ist unsere allgemeine Schlußfolgerung, daß jeder technische Informationsschutz in Computersystemen zu einem gewissen Grad entweder auf einem physikalischen Schutz, Sicherheit durch Undurchschaubarkeit oder Kombinationen davon beruht.
  • Das Ziel der Sicherheit durch Undurchschaubarkeit besteht darin, die Schwierigkeit für einen Angriff derart zu vergrößern, daß er sich in der Praxis nicht lohnt, selbst wenn er eventuell erfolgreich sein könnte. Ein erfolgreicher Angriff gegen die Undurchschaubarkeits-Verteidigungen hängt von der Fähigkeit ab, einige Schlüsselinformationen zu erhalten. Das naheliegendste Beispiel besteht darin, Paßwörter anzugreifen und zu verteidigen, und weil dieses Problem den Sachverhalt deutlich veranschaulicht, werden wir es als Beispiel verwenden. Beim Paßwortschutz gibt es im allgemeinen drei Gesichtspunkte, um einen Angriff schwierig zu machen. Ein Gesichtspunkt besteht darin, das Feld für das Paßwort groß zu gestalten, so daß die potentielle Anzahl von für einen Angriff erforderlichen Versuchen enorm ist. Der zweite Gesichtspunkt besteht darin, die Wahrscheinlichkeitsdichte zu verbreitern, so daß im selektiven Suchen des Platzes bzw. der Stelle nur ein relativ kleiner Vorteil liegt. Dies ist im Grunde das gleiche wie das Konzept der Verteilung von Shannon. Der dritte Gesichtspunkt besteht darin, die gespeicherte Paßwortinformation undurchsichtig zu gestalten, so daß der Angreifer es nicht einfach in der gespeicherten Form lesen kann. Dies entspricht im wesentlichen dem Konzept der Konfusion von Shannon." (S. 566)
  • In dem Artikel wird folgende evolutionäre Verteidigung vorgeschlagen:
  • "Eine praktischere Lösung für dieses Problem könnte in der Verwendung von evolutionären Verteidigungsmitteln bestehen. Um eine derartige Verteidigungsstrategie für eine Vielzahl von Varianten (beispielsweise eine pro Computer weltweit) kosteneffizient zu machen, wird wahrscheinlich eine gewisse Art von Automatisierung erforderlich sein. Wenn die Automatisierung wirksam sein soll, muß sie einen großen Suchbereich erzeugen und ein erhebliches Maß von Konfusion und Verteilung bzw. Diffusion ergeben. Dies wäre dann das Ziel von evolutionären Verteidigungsmitteln.
  • Die Evolution kann auf viele verschiedene Arten und an vielen unterschiedlichen Orten erzielt werden, die von einer, von unterschiedlichen Händlern bereitgestellten, kleinen endlichen Anzahl von Verteidigungsmitteln bis zu einem Verteidigungssystem reicht, das sich selbst durch jeden Systemaufruf weiterentwickelt. Mit einer umfangreicheren Evolution bzw. Weiterentwicklung erhalten wir eine geringere Leistung, erzeugen jedoch höhere Kosten für einen Angriff. Wie bei allen Schutzfunktionen ist somit ein Preis für einen verbesserten Schutz zu zahlen. Unter der Voraussetzung, daß wir einen ausreichend wirksamen Mechanismus für eine wirksame Evolution finden, können wir ein großes Maß an Mannigfaltigkeit mit praktisch keinen Kosten für den Endanwender erzeugen, während wir die Kosten für einen Angriff in großem Ausmaß stark erhöhen. Als ein angenehmer Nebeneffekt könnte der ultimative Angriff für jedes angegriffene System erforderlich werden. Anders ausgedrückt können Angreifer, außer bei endemischen Fehlern, wieder zu Einzelfall-Angriffsexperten herabgestuft werden, und das Verteidigungsszenario kann den physikalischen Zugang umfassen." (S. 567)
  • Es existiert eine große Anzahl von Patenten, die unterschiedliche Wege zum Schutz von Software und/oder Hardware und den darin enthaltenen Informationen beschreiben. Für diese Patente werden nachfolgend nur einige Beispiele gegeben.
  • Das am 25. Juni 1985 auf den Namen Curran et al erteilte US-Patent Nr. 4 525 599 mit dem Titel "Software Protection Methods and Apparatus", sieht als Kopierschutz von ROM-resistenter Software eine Schutzschaltung vor, die Verschlüsselungs-/Entschlüsselungs-Einrichtungen einschließt, die zwischen dem Mikroprozessor und dem ROM-Speicher geschaltet sind.
  • Gemäß dem am 6. Januar 1987 auf den Namen Chorley et al erteilten US-Patent Nr. 4 634 807 mit dem Titel "Software Protection Device", ist zum Verhindern des unautorisierten Kopierens von Software vorgesehen, daß ein Software-Modul gemäß dieser Erfindung durch DES verschlüsselt wird, wobei der Schlüssel unter Verwendung des öffentlichen Schlüssels eines öffentlichen/- privaten Schlüssel-Algorithmus verschlüsselt wird.
  • Bei dem am 26. April 1988 auf den Namen William erteilten US-Patent Nr. 4 740 890 mit dem Titel "Software Protection System With Trial Period Usage Code and Unlimited Use Unlocking Code Both Recorded on Program Storage Media", ist vorgesehen, daß die Speicherplatte nach einem Versuchszeitabschnitt betriebsunfähig wird, damit das System die weitere Verwendung des Programms verhindern kann, bis ein entsprechender Sperr- Code eingegeben wird.
  • Das am 12. September 1989 auf den Namen Karp erteilte US- Patent Nr. 4 866 769 mit dem Titel "Hardware Assist for Protecting PC Software" beschreibt eine Kopierschutztechnik für PC-Software. Bei diesem Verfahren wird eine eindeutige ID im ROM eines Personal-Computers gespeichert, mit dem Software auf einer Diskette verwendet werden soll. Auf diese ID kann der Benutzer des Computers zugreifen. Ein Händler, der seine durch Disketten vertriebene Software vor einem illegalen Kopieren oder einer illegalen Verwendung schützen möchte, sieht auf der Diskette eine Quell-ID vor.
  • Gemäß dem am 20. Februar 1990 auf den Namen Chandra et al. erteilten US-Patent Nr. 4 903 296 mit dem Titel "Implementing a Shared Higher Level of Privilege on Personal Computers for Copy Protection of Software", ist das Original-Medium in funktioneller Hinsicht nicht reproduzierbar, bis es durch die Ausführung eines Programms modifiziert wird, das in einem nachahmungssicheren Co-Prozessor gespeichert ist, der einen Teil des Computers bildet.
  • Bei dem Lizenz-Management-System gemäß dem am 26. Juni 1990 auf den Namen Robert et al. erteilten US-Patent Nr. 4 937 863 mit dem Titel "Software Licensing Management System" wird ein Lizenz-Anzahl-Wert für jedes, lizensierte Programm sowie ein Zeiger auf eine Tabelle gespeichert, die einen Anforderunge- Anzahl-Wert speichert, der der Verwendung von jedem lizensierten Programm zugeordnet ist. Als Reaktion auf einen Antrag ein lizensiertes Programm zu verwenden, antwortet das Lizenz- Management-System mit einem Hinweis, ob der Lizenz-Anzahl- Wert den der Anwendung zugeordneten Anforderungs-Anzahl-Wert übersteigt.
  • Das am 10. September 1991 auf den Namen Wiedemer erteilte US-Patent Nr. 5 047 928 mit dem Titel "Billing System for Computer Software" lehrt ein Buchungssystem, bei dem das Anwendungsprogramm gemäß einem Algorithmus kodiert ist, der auf einem numerischen Schlüssel basiert. Der Computer des Benutzers ist mit einem Hardware-Sicherheits-Modul und einem entfernbaren Buchungsmodul versehen, von denen beide eindeutige Codes aufweisen.
  • Das am 16. Juni 1992 auf den Namen Ostrovsky erteilte US- Patent Nr. 5 123 045 mit dem Titel "Comprehensive Software Protection System", ergibt ein Modell für den Speicherzugriffsschutz während der Ausführung eines Programms, und es ergibt weiterhin den Schutz von im Speicher gespeicherten Daten. Das Patent beschreibt ein Datenverarbeitungssystem, das eine Vielzahl von "Puffer"-Datenstrukturen zur Speicherung verschlüsselter Software und verschlüsselter Daten in einem un geschützten Speicher umfaßt. Die Software und die Daten werden gemäß einer Pseudo-Zufalls-Abbildung derart gespeichert, daß das Zugriffsmuster während der Ausführung des Programms dem fremden Beobachter keine Informationen zurückliefert. Das Schema ist sicher, die Existenz eines physikalisch abgeschirmten Chips, der eine konstante Anzahl von Registern enthält, und die Existenz von irgendeiner Einweg-Funktion vorausgesetzt.
  • Gemäß dem am 18. Mai 1993 auf den Namen Glover et al. erteilten US-Patent Nr. 5 212 728 mit dem Titel "Dynamic Trace Elements", ist eine Überwachungsschaltung mit dem Rest der Schaltung eines Produkts verbunden, ihre Funktion hat jedoch nichts mit dem momentanen Betrieb des Produkts zu tun. Eine oder mehrere Zeilen des Überwachungscodes werden in Zeilen des echten Codes eingebettet. Der Überwachungs-Software-Code wirkt mit der Überwachungsschaltung zusammen. Auch wenn der Überwachungs-Software-Code bezogen auf den Ablauf des echten Software-Codes keine Funktion erfüllt, wirkt er mit der vorhandenen Hardware zusammen, d. h. mit der Überwachungsschaltung. Ein Kopierer, der das Programm disassembliert hat, hätte beträchtliche Schwierigkeiten bei der Feststellung dieser Tatsache. Bei einer anderen Ausführungsform können eine oder mehrere Zeilen von Überwachungscodes in den echten Code eingebettet werden, sie wirken jedoch mit Zeilen des echten Codes zusammen, um Ergebnisse zu erzeugen, die nicht in Verbindung mit dem Betrieb oder dem Ablauf des echten Codes stehen.
  • Gemäß dem am 15. Februar 1994 auf den Namen Holmes erteilten US-Patent Nr. 5 287 407 mit dem Titel "Computer Software Protection" ist innerhalb einer Hauptkopie einer Software- Datei ein vorherbestimmter Datenblock vorgesehen. Wenn von dieser Datei eine Kopie erstellt wird, wird dieser Datenblock innerhalb der kopierten Datei angeordnet und mit Daten überschrieben, die die kopierte Datei identifizieren. Wenn eine nicht-autorisierte Kopie aufgefunden wird, können die die Kopie identifizierenden Daten gelesen und die Quelle der nichtautorisierten Kopie verfolgt werden.
  • Allgemein ausgedrückt können die Schutztechniken, einschließlich einiger der oben genannten, im wesentlichen als die Anwendung des Gegenteils der Grundlagen des "klaren Designs" aufgefaßt werden. Bei der Entwicklung von Software oder Hardware existieren bestimmte Grundsätze, die angewendet werden, um das Design klar, verständlich, managebar und gut organisiert zu machen. In Bezug auf Software werden derartige Grundsätze als "Grundsätze des Software-Engineering" bezeichnet. Wenn jedoch, einfach ausgedrückt, die Anwendung eines Satzes von Grundsätzen zur einfacheren Verständlichkeit und Änderbarkeit des Designs bzw. Entwurfs beiträgt, dann führt die Anwendung ihrer Gegensätze wahrscheinlich dazu, daß der Entwurf schwerer zu verstehen und zu ändern ist.
  • Beispielsweise bei Software weist die Wahl von mnemonischen bzw. merkfähigen Variablen auf die tatsächliche Verwendung dieser Variablen hin, was wichtig zum Verständnis des Programms ist. Daher würde die Wahl von variablen Namen, die entweder keinen Bezug zu ihrer Verwendung, oder einen unterschiedlichen Bezug zu ihrer Verwendung aufweisen, das Verständnis und die Änderung der Software erschweren.
  • Die Anwendung des Gegenteils der "klaren Design-Grundsätze" soll mit dem Namen "anti-klares Design" bezeichnet werden.
  • Die vorliegende Erfindung ist in Bezug auf ihren Zweck und ihre angestrebte Wirkung analog zu diesen Ansätzen, d. h. sowohl der Ansatz des "anti-klaren Designs" als auch die vorliegende Erfindung sind dazu vorgesehen, geistiges Eigentum zu schützen und eine (wirksame) Nachahmung bzw. Kopie zu verhindern. Die Grundlage des erfindungsgemäßen Verfahrens besteht jedoch nicht in der Anwendung des Gegensatzes der "klaren Design-Grundsätze". Die Erfindung unterscheidet sich in zwei entscheidenden Wegen von derartigen bekannten Ansätzen.
  • Erstens haben die bekannten Ansätze nicht gegen wirklich bestimmte Angriffe geholfen. Viele Arten von Verschleierungen wurden bei dem Ansatz des "anti-klaren Designs" mit Hilfe von Analyse-Werkzeugen einfach durchschaut, die beispielsweise in Datenfluß-Analysern, optimierenden Compilern oder Programm- Slicing-Hilfsmitteln zu finden sind.
  • Zweitens basiert das vorliegende Verfahren auf den Begriffen der Kolmogorov-Komplexität und der Computer- bzw. Rechen- Graphen-Theorie, nicht auf der Umkehr der Regeln von Thumb über das Software-Engineering oder der Grundsätze des klaren Hardware-Designs. Daher sind die bei einem "anti-klaren Design"-Verfahren angewendeten Operationen oberflächlich und lokal, während die bei dem erfindungsgemäßen Verfahren angewendeten Operationen tiefgehend und global sind.
  • Die Kolmogorov-Komplexitäts-Theorie ergibt einen Weg zur Messung des "wesentlichen" Informationsgehaltes eines Informationsteils (von beliebiger Art). Gemäß der üblichen Informationstheorie ist beispielsweise die durch die Übertragung einer Nachricht, die aus der binären Codierung der Zahl π = 3,14156... besteht, dargestellte Information unendlich: Es existieren unendlich viele Dezimalstellen und die Zahl ist nicht-periodisch. Die wesentliche Information ist jedoch nicht unendlich: Es ist möglich die Reihe von Dezimalstellen in Form eines kleinen Programms zu definieren, das so viele Dezimalstellen von π wie erwünscht berechnet. Da diese Programm klein ist, ist die Menge der "wesentlichen" Information in π ebenfalls klein. In der vorliegenden Beschreibung verwenden wir das analoge Prinzip, um mit der wesentlichen Komplexität eines Computer-Programms P und der wesentlichen Komplexität der Gewinnung eines anderen Programms Q aus einem Programm P umzugehen. Für eine Einführung in die Kolmogorov-Komplexität wird auf das "Handbook of Theoretical Computer Science", Elsevier/- MIT Press, ISBN 0-444-88074-7 (Volum A, Chapter 4) verwiesen.
  • Durch die Erweiterung dieses Konzeptes können wir die Größenordnung des Unterschiedes zwischen Programmen, durch das, was wir den gerichteten Kolmogorov-Abstand zwischen ihnen nennen, messen. Für irgendein festes Programm-Alphabet und ein Kodierverfahren wird der gerichtete Kolmogorov-Abstand zwischen dem Programm P und dem Programm Q als die Länge des kleinsten Programms definiert, das P als Eingangsdaten erhält und Q als Ausgangsdaten liefert. Obwohl sich dieser Abstand von einer Kodierung zur anderen ändert, sind die Abweichungen gemäß dem Invariance-Theorem der Kolmogorov-Komplexitäts-Theorie scharf begrenzt. In diesem Zusammenhang wird auf "An Introduction to Kolmogorov Complexity and its Applications" von Ming Li und Pau Vitanyi, ISBN 0-387-94053-7: Abschnitt 2.1: "The Invariance Theorem" verwiesen. Man beachte das folgende Zitat aus Beispiel 2.2: "Das Invariance-Theorem zeigt tatsächlich, daß es zum knappen Ausdrücken eines Algorithmus in einem Programm nicht darauf ankommt, welche Programmiersprache verwendet wird (bis auf eine feste zu addierende Konstante, die nur von den beiden zu vergleichenden Programmiersprachen abhängt)".
  • Ein Design von der Art, wie es durch das Verfahren gemäß der Erfindung erzeugt wird, ist zu einer verschlüsselten Nachricht analog, wobei die Enthüllung der Nachricht ohne Kenntnis des Schlüssels zwar im Prinzip möglicht, jedoch in der Praxis derart schwierig ist, daß die Nachricht nur sehr unwahrscheinlich ohne den Schlüssel zu enthüllen ist. Trotz der Analogie zur Verschlüsselung hinsichtlich des Zwecks und der gewünschten Wirkung, betrifft die Erfindung jedoch nicht die Cryptographie bzw. Verschlüsselung. Ein durch das vorliegende Verfahren erhaltenes Software-Programm oder eine Hardware-Vorrichtung ist "wie sie ist" ausführbar: ihre Information braucht zur Verwendung nicht dekodiert zu werden. Das Verfahren nimmt ausführbare Information (Software, die auf einem Computer laufen kann, oder ein Hardware-Design, das zur Herstellung einer integrierten Schaltung oder einer anderen Hardware-Vorrichtung verwendet werden kann) und transformiert sie in eine neue Form, die immer noch ausführbar ist, die jedoch den Inhalt sowohl vor der Enthüllung als auch vor der Nachahmung schützt.
  • Das Verfahren bewahrt den Wert des Designs bzw. Entwurfs: Es besteht keine Notwendigkeit für eine Entschlüsselung, um den Wert zurückzugewinnen, und keine Notwendigkeit für einen Schlüssel, um auf den Wert zuzugreifen. Eine verschlüsselte Nachricht hat jedoch nur in Verbindung mit ihrem Schlüssel einen Wert, und ihr Wert (die Information der Nachricht) kann nur durch Entschlüsselung erhalten werden. Ohne Schlüssel oder Entschlüsselung hat die verschlüsselte Nachricht selbst keinen praktischen Wert. Gemäß der vorliegenden Erfindung kodierte Programme bzw. Designs sind so wie sie sind ohne Schlüssel nutzbar: verschlüsselte Nachrichten sind nur mit einem Schlüssel und nur wenn sie entschlüsselt sind, nutzbar.
  • Aufgaben der Erfindung
  • Es ist daher ein Grundgedanke der Erfindung, zum Schutz der Sicherheit ein Verfahren zur Kodierung eines ausführbaren Programms zur Verfügung zu stellen.
  • Es ist ein weiterer Grundgedanke der vorliegenden Erfindung, zum Schutz vor Nachahmungen bzw. Vervielfältigungen, ein Verfahren zur Kodierung eines ausführbaren Programms und zum Verbergen der darin enthaltenen Informationen derart bereitzustellen, daß das kodierte Programm ausführbar bleibt.
  • Es ist ein weiterer Grundgedanke der vorliegenden Erfindung, zum Schutz vor Nachahmungen bzw. Vervielfältigungen, ein Verfahren zur Kodierung eines ausführbaren Programms und zum Verbergen der darin enthaltenen Informationen bereitzustellen, während das kodierte Programm ausführbar bleibt.
  • Es ist noch ein weiterer Grundgedanke der vorliegenden Erfindung, zum Schutz vor Nachahmungen bzw. Vervielfältigungen, ein Verfahren zur Kodierung eines ausführbaren Programms und zum Verbergen der darin enthaltenen Informationen bereitzustellen, während das kodierte Programm ausführbar bleibt, jedoch eine Falle enthält, die aktiviert werden kann, um das Programm in einen nicht-ausführbaren Zustand zu versetzen.
  • Beschreibung der Erfindung
  • Kurz ausgedrückt betrifft die Erfindung ein Verfahren zur Kodierung eines ausführbaren Programm zum Schutz vor Nachahmungen und zur Verdeckung der darin enthaltenen Informationen, derart daß das kodierte Programm ausführbar bleibt. Gemäß der Erfindung umfaßt das Verfahren die Schritte zwei oder mehr identische Kopien einer Prüfkaskade für jeden von einem oder mehreren Grundblöcken des ausführbaren Programms anzufertigen, wobei jede Prüfkaskade ähnlich zu jedem entsprechenden Grundblock ist und eine Länge und Breite entsprechend einem vorherbestimmten Sicherheitslevel aufweist.
  • Das Verfahren schließt dabei weiterhin die Schritte des Einfügens von periodischen Prüf-Codes ein, die über die Kopien der Prüfkaskaden verteilt sind, wobei die Prüf-Codes zur Überwachung der erwarteten Ausgangsdaten der Prüfkaskaden an vorherbestimmten Punkten des ausführbaren Programms und zum Verschachteln bzw. Verweben des ausführbaren Programms und der Prüfkaskaden dienen, so daß die Ausgangsdaten des kodierten ausführbaren Programms von allen Eingangsdaten des ausführbaren Programms und der Prüfkaskaden abhängen.
  • Bei dieser Anmeldung befassen wir uns nur mit Programmen, die einen Datenzugriff ohne Pseudonym bzw. Alias aufweisen, d. h. denjenigen, die als "reine" Daten-Fluß-Diagramme dargestellt werden können. Aggregierte bzw. zusammenhängende Daten können einfach durch gut bekannte Transformationen gehandhabt werden, die die aggregierten Daten in scalare Daten und zusätzlichen Code umsetzen. Diese Transformation kann vor der Kodierung gemäß der vorliegenden Erfindung durchgeführt werden.
  • Kurze Beschreibung der Zeichnungen
  • Fig. 1 ist eine schematische Darstellung eines Operationsknotens, der sich in einem Programm findet,
  • Fig. 2 ist eine schematische Darstellung eines beispielhaften Netzwerks aus dem Operationsknoten,
  • Fig. 3 ist ein Beispiel eines einfachen Programms, das in Basisblöcke aufgeteilt ist,
  • Fig. 4 zeigt, daß dort viele Kaskaden vorliegen, die dem ursprünglichen Programm ähnlich sind, Fig. 5 zeigt einen einfachen Fall, bei dem zwei Stränge von Operationen, zum Beispiel ein Original-Programm und der Takt, kombiert sind,
  • Fig. 6 zeigt schematisch ein Beispiel einer Verschachtelung des Codes nach Fig. 5, und
  • Fig. 7 zeigt schematisch ein alternatives Beispiel der Verschachtelung des Codes von Fig. 5.
  • Ausführungsformen der Erfindung
  • Wie bereits erwähnt, ist ein Software-Programm oder ein Hardware-Design (hier einfach als Programm bezeichnet), wie beispielsweise eine Netzliste für eine integrierte Schaltung, reine Information. Daher kann sie von irgendeinem Empfänger einfach verändert werden. Es besteht jedoch ein Unterschied zwischen einer willkürlichen Änderung (zum Beispiel ist das Löschen oder Zerstören eines Programms mit Sicherheit eine Änderung) und einer wirksamen Änderung. Das Ziel beim Ändern eines Programms besteht normalerweise darin, ein neues Programm zu erzeugen, dessen Verhalten ähnlich dem des Originals ist, dessen Verhalten jedoch auf eine Art verändert ist, die dem Modifizierer nützt. Beispielsweise kann ein Programm - z. B. ein Textverarbeitungsprogramm - als kostenlose Probe einem potentiellen Kunden zur Verfügung gestellt werden, und es kann derart aufgebaut sein, daß es bis zu einem bestimmten Datum in naher Zukunft als Textverarbeitungsprogramm arbeitet. Eine nützliche Veränderung für den Empfänger bestünde darin, das Datum in ein weit in der Zukunft liegendes Datum zu ändern, wodurch er permanenten Zugriff auf das Textverarbeitungsprogramm erhält.
  • In dieser Beschreibung wird ein Programm wirksam unveränderbar genannt, wenn es derart beschaffen ist, daß die Durchführung irgendeiner derartigen, bezogen auf das Verhalten kleinen, jedoch nicht überflüssigen, für den Empfänger nützlichen Änderung des Designs äußerst schwierig durchzuführen ist - schwierig genug, um auch einen sehr bestimmten Empfänger zu entmutigen.
  • Die bei dieser Beschreibung verwendete Sicht eines Programms basiert auf einer Standard-Sichtweise, die bei optimierenden Compilern verwendet wird, die jedoch verändert ist, um parallele Steuerungsübertragungen zu ermöglichen. Das "Programm" kann genauso gut eine Netzliste für integrierte Schaltungen wie auch ein Software-Quell-Code für Software-Programme, oder eine VHDL-Beschreibung für Hardware sein. Es sollte beachtet werden, daß ein "Prozeß" die Ausführung oder den Betrieb eines Programms bezeichnet, das normalerweise aus einer Sammlung von Schritten besteht.
  • Eine einheitliche Darstellung, die in vielen optimierenden Compilern für sequentielle Sprachen verwendet wird, ist in "Compilers: Principles, Techniques and Tools" von Alfred V. Aho, Ravi Sethi und Jeffrey D. Ullman, ISBN 0-201-10088-6 beschrieben. In Abschnitt 9.4: "Basic blocks and flow graphs" beschreibt dieses Buch, wie normaler Code als eine Reihe von Daten-Fluß-Netzwerken aufgefaßt werden kann, die Operationsknoten aufweisen, die durch Datenverbindungen (Bögen, Kanten) verbunden sind. Die Operationsknoten sind Knoten mit einem oder mehreren Eingangs-Anschlüssen und einem oder mehreren Ausgangs-Anschlüssen. Jeder Ausgangs-Anschluß eines Operationsknotens kann mit einem oder mit mehreren Eingangs-Anschlüssen einiger Operationsknoten verbunden sein.
  • Fig. 1 zeigt einen Operationsknoten, bei dem die Eingangs- Anschlüsse 1, 2 und 3 auf der Innenseite des Kästchens und die Ausgangs-Anschlüsse 1 und 2 auf der Außenseite liegen. Die Eingangs-Anschlüsse und die Ausgangs-Anschlüsse sind fortlaufend numeriert. Der Name des Operationsknotens, eine Beschreibung davon, oder beides, können auf der Innenseite der Box bzw. des Kästchens vorgesehen sein. Ein Operationsknoten tut so lange nichts, bis er einen Wert auf jedem seiner Eingangs-Anschlüsse und keinen Wert auf irgendeinem seiner Ausgangs-Anschlüsse aufweist. Zu diesem Zeitpunkt ist er in die Lage versetzt zu "feuern", wodurch er einen Wert auf jeden seiner Ausgangs-Anschlüsse legt. Wenn ein Ausgangs-Anschluß mit einem oder mit mehreren Eingangs-Anschlüssen derart verbunden ist, daß alle Eingangs-Anschlüsse leer sind, kann der Wert am Sende-Ende (dem Ausgangs-Anschluß) zu dem Eingangs-Ende (Eingangs-Anschluß) übertragen werden. Dies löscht den Ausgangs-Anschluß.
  • Ein Betriebsknoten ist mit anderen Betriebsknoten über Datenverbindungen (Bogen, Kanten) verbunden, um Datenfluß-Netzwerke zu bilden. Fig. 2 zeigt, lediglich beispielhaft, die Implementation eines GateAdd-Netzwerks bzw. eines Addier-Gatter-Netzwerks. Das Netzwerk erwartet ein Takt-Synchronisations-Signal an seinem Eingangs-Anschluß 1 und InData- bzw. Eingangs-Daten- Werte, beispielsweise a und b, an seinen Eingangs-Anschlüssen 2 und 3. Wenn alle Werte vorliegen, feuert es ein Ergebnissignal am Ausgangs-Anschluß 1 ab. Dieses Netzwerk ist ein synchroner (getakter) Addierer, der aus asynchronen Addierern aufgebaut ist.
  • Diese Sicht von Programmen stellt die Grundlage für das Programm-Modell bzw. PROGRAM MODEL dar, das in dieser Beschreibung benutzt wird, wobei weiterhin Aufruf-Operationen vorgesehen sind, die die Ausführung von Unterprogrammen auslösen können. Ein PROGRAM weist, dann, eine 2-Level-Standarddarstellung als ein Steuerungs-Flußgraph auf, bei dem Knoten des Kontroll- Flußgraphen die Basis-Blöcke (BB's) darstellen und eingebettete anti-zyklische Datenflußgraphen (DFG) die in diesen Basis- Blöcken durchgeführten Berechnungen sind. Es existiert ein bestimmter "Start"-Basisblock, bei dem die Ausführung beginnt und an dessen Eingangs-Anschlüssen die Eingangsdaten des Programms angelegt werden. Ein Anfangs-Zustand (Anfangswerte, die an einigen der Eingangs-Anschlüsse des Programms vor Beginn der Ausführung anliegen müssen) ist ebenfalls erlaubt.
  • Fig. 3 beschreibt ein Beispiel eines Programms, das in BBs aufgeteilt ist, von denen jeder als ein Kästchen bzw. eine Box dargestellt ist. Zur Veranschaulichung schließt es ein Schleifen-BB und ein "if" bzw. "wenn"-Anweisungs-BB ein, um anzuzeigen, daß bei der Erfüllung einer bestimmten Bedingung die Ausführung schleifenförmig ist.
  • Bei der obigen Sicht von BBs, ist ein BB eine Folge von aufeinanderfolgenden Anweisungen, bei denen der Steuerungsfluß am Anfang eintritt und am Ende austritt, ohne anzuhalten oder der Möglichkeit einer Verzweigung, außer am Ende. Ein BB stellt daher eine Code-Sequenz ohne Bedingungen und ohne Schleifen dar, ähnlich wie eine "geradlinige" Code-Folge bei sequenziellen Sprachen.
  • Die BBs sind miteinander verbunden, d. h. Verbindungen (Bögen, Kanten) verbinden einige Ausgangs-Anschlüsse von einigen BBs mit einigen Eingangs-Anschlüssen von anderen BBs.
  • Eine Aufruf-Operation (INVOCATION OPERATION) kopiert eine ROUTINE (wodurch eine "instance" der Routine erzeugt wird), wobei die Werte an ihre Eingangs-Anschlüsse der Eingabedaten- Anschlüsse der Instanz angelegt werden. Die Aufruf-Operationen (INVOCATION-OPERATIONS) weisen Ruf-Operationen (CALL OPERATIONS) und Verzweigungs-Operationen (FORK-OPERATIONS) auf. Eine Ruf- Operation (CALL OPERATION) wartet, sobald sie die Ausführung einer Instanz einer Routine auslöst, auf die Beendung der Instanz, und dann legt sie die Werte an die Ausgabedaten-Anschlüsse der Instanz, an ihre entsprechenden Ausgabe-Anschlüsse. Somit entspricht eine Ruf-Operation (CALL OPERATION) einem Prozedur- oder Funktions-Aufruf. Eine Verzweigungs-Operation (FORK OPERATION) wartet nicht auf die Beendigung der Instanz, und wenn die Instanz beendet wird, wird sie einfach verworfen. Eine Verzweigungs-Operation (FORK OPERATION) entspricht einer Prozeß-/Task-Erzeugung.
  • Unabhängig vom Grad der Parallelität in dem Programm, kann es betrachtet werden, als ob es eine Reihe von "im wesentlichen" sequentiellen Prozessen ausführt, wobei ein Prozeß entweder die Ausführung der Haupt- (MAIN-) Routine und der von ihr aufgerufenen Routinen, oder die Ausführung eines Prozesses (Routinen-Instanz) ist, der durch eine Verzeigungs- (FORK-) Operation oder die von ihr aufgerufene Routinen aktiviert wird. Ein Prozeß, der nicht der Haupt- (MAIN-) Prozeß ist, kann nur durch die Verwendung der Verzweigungs-Operation (FORK-OPERATION) erzeugt werden. Die Parallelität in dem Programm wird in einen einzigen sequentiellen Strom von Prozessen zerlegt; dies wird häufig in irgendwelchen Multitasking-Betriebssystemen eingesetzt.
  • Diese Sichtweise ist für viele Hardware-Designs geeignet weil:
  • 1. Innerhalb von jedem Prozeß eine extensive (jedoch gebundene) Parallelität erlaubt ist.
  • 2. Die durch die Verzweigungs-Operation (FORK OPERATION) erzeugten Teile der Prozesse können beliebig klein sein, bis hinab zu dem Level eines einzigen Operationsknotens.
  • Viele Hardware-Designs und Programme in sequentiellen oder parallelen Programmierhochsprachen, die gemeinsame Speicher (shared menory), eine Nachrichtenweiterleitung und verteilte Designs darstellen, können in der oben angegebenen Form kodiert werden, ebenso wie Programme auf niedrigeren Leveln wie beispielsweise der Assembler-Sprache.
  • Ein Programm (PROGRAM) weist eine Haupt-Routine (MAIN ROUTINE) plus einen Satz anderer Routinen, plus einen Anfangszustand (INITIAL STATE) auf, der Werte für einige der Eingangsdaten- Anschlüsse (ENTRY PORTs) des Programms vorgibt. Die Ausführung beginnt mit Werten gemäß dem Anfangszustand (INITIAL STATE) an den spezifizierten Eingangsdaten-Anschlüssen, und den Eingangsdaten (INPUT) des Programms an den anderen Eingangs-Anschlüssen (ENTRY PORTs) des Programms.
  • Das Kodierverfahren gemäß der vorliegenden Erfindung muß das Verhaltens-Aufrechterhaltung und die Proximitäts-Inversion sicherstellen. Nachfolgend wird diese Kodierung gemäß der Erfindung EIS- (Effectively Immutable Software und Hardware = wirksam unveränderbare Software und Hardware) Kodierung genannt, welche die bereits genannten Aufgaben löst. Innerhalb dieser Beschreibung wird EIS oder EIS-Kodierung der Kürze wegen anstelle von wirksamer unveränderbarer Software- und Hardware- Kodierung verwendet.
  • Proximitäts-Inversion:
  • Ein Programm P ist proximitäts-invertierend, wenn jede kleine Änderung in P eine große Änderung im Verhalten von P hervorrufen muß.
  • Eine EIS-Kodierung nimmt ein normales Programm P und gibt ein Programm Q mit Proximitäts-Inversion und mit dem gleichen Verhalten wie P aus. In gewissem Sinn versuchen die "klares Design-Grundsätze" die Proximität zu bewahren, obwohl auch Bereiche erzeugt werden (die typischerweise Module genannt werden), um die Proximität einzuschränken. Wie vorstehend beschrieben, garantiert das "anti-klar"-Design die Proximitäts- Inversion nicht, es verhindert sie lediglich nicht aktiv.
  • Kaskade:
  • Eine Kaskade ist ein azyklischer DFG, derart, daß jeder der Ausgangs-Anschlüsse von allen der Eingangs-Anschlüsse abhängt. Der Sinn besteht darin, daß die Änderung irgendeines Eingabewertes fast alle der Ausgabewerte mit hoher Wahrscheinlichkeit verändern wird. Anders ausgedrückt ist eine Kaskade ein Block von Berechnungen, derart daß jeder der Ausgänge von allen der Eingänge abhängt. Eine andere Möglichkeit besteht darin, den Abhängigkeitsgraphen der Kaskade zu betrachten: Es handelt sich um einen einzelnen dichten Graphen ohne unabhängige Unter- bzw. Teilgraphen.
  • Die Kaskaden werden hauptsächlich als ein "Rückgrat" des dichten Abhängigkeitsgraphen verwendet. Das bedeutet, daß die Kaskaden für jeden Basisblock unter Verwendung des Steuergraphen miteinander verbunden sind, wodurch ein Programm gebildet wird, das parallel zum ursprünglichen Programm ausgebildet ist, jedoch eine dichte und komplexe Abhängigkeit aufweist. Da das einzige Interesse dem Abhängigkeitsgraphen gilt, ist das Ergebnis der Berechnung nicht wirklich von Interesse. Wie dies in Fig. 4 dargestellt ist, ist es möglich, verschiedene Kaskaden zu erzeugen, die dem ursprünglichen Programm ähnlich sind, wie beispielsweise die Takt-Kaskade und die Prüf-Kaskaden C1 und C2 etc.
  • Das ursprüngliche Programm wird dann mit diesen Kaskaden verschachtelt, wodurch der ursprüngliche Abhängigkeitsgraph (dependency graph) "versteckt" wird. Anders ausgedrückt wird der ursprüngliche Abhängigkeitsgraph (der sehr regelmäßig und/oder einfach sein kann) zu einer willkürlich aufgebauten Monstrosität "gemischt" bzw. "gemerged". Dies macht es extrem schwierig den ursprünglichen Abhängigkeitsgraphen wieder zu gewinnen (wodurch eine der Hauptmöglichkeiten der Rückwärts-Entwicklung vereitelt wird).
  • Einige Maßzahlen für die "Güte" einer Kaskade sind:
  • - für jeden Operationsknoten, die Anzahl der durch ihn beeinflußten Ausgänge; und
  • - für jeden Operationsknoten, die Anzahl von durch ihn beeinflußten nachfolgenden Operationsknoten.
  • Eine einfache Möglichkeit zum Aufbau einer Kaskade besteht in der Verwendung eines Schiebenetzwerks der gewünschten Größe, beispielsweise eines Banyan-Netzwerks. Ersetze jedes der 2 · 2 Schaltelemente durch eine Verschachtelungsfunktion mit zwei Eingängen und zwei Ausgängen. Das sich ergebende Netzwerk ist eine Kaskade. Obwohl es ausreichend ist, Kaskaden mit gleichmäßiger Struktur zu verwenden, ist es natürlich wünschenswert Kaskaden mit ungleichmäßiger Struktur zu verwenden.
  • Verschachtelungs-Funktionen:
  • Eine M-> N (von M zu N) Verschachtelungsfunktion F ist eine Funktion mit M Eingängen und mit N Ausgängen. Es ist (fast immer) erforderlich, daß F invertierbar ist, und daß jeder der Ausgänge von allen der Eingänge abhängt. Formaler ausgedrückt: Eine Verschachtelungsfunktion ist ein Sub-DFG mit einer Vielzahl von Eingängen und Ausgängen, derart, daß jeder Ausgang eine Funktion von mehr als einem Eingang ist, und daß die Aggregations-Funktion von den Eingängen zu den Ausgängen mit hoher Wahrscheinlichkeit invertierbar ist (d. h., die Informationen werden aufrechterhalten). Derartige Funktionen werden für unterschiedliche Zwecke verwendet:
  • (1) Zum Aufbau von Kaskaden: um eine Kaskade aufzubauen, braucht man ein Netzwerk mit M Eingängen und N Ausgängen, wobei M und N größer als zwei sind. Die Form des Netzwerks sollte derart sein, daß wenn jeder Knoten ein Multi-Eingangs-, Multi-Ausgangs-Schalter ist, der alle seiner Eingänge zu jedem seiner Ausgänge leiten kann, dann jeder Ausgang des Netzwerks von jedem Eingang des Netzwerks erreichbar ist, in Abhängigkeit von der Richtung des an jedem Schaltknoten auftretenden Informationsflusses. (Beispiele für derartige Netzwerke sind Banyan- und Omega-Schiebe-Austausch-Netzwerke.) Um das Netzwerk von einem Schaltnetzwerk zu einer Kaskade umzuformen, ersetzen wir jeden Schaltknoten durch eine Verschachtelungsfunktion, die die gleiche Anzahl von Eingängen und Ausgängen wie der Schaltknoten aufweist. "Multi" bedeutet innerhalb dieser Beschreibung "mehr als eins". Beispielsweise werden für Banyan- und Omega- Netzwerke 2-Eingangs-, 2-Ausgangs-Schaltelemente verwendet, so daß diese durch 2-Eingangs-, 2-Ausgangs- Verschachtelungsfunktionen in unserer Kaskade ersetzt würden.
  • (2) Um die Dichte der Zwischen-Abhängigkeiten in dem Programm zu erhöhen: angenommen es liegen unabhängige Berechnungsstränge vor (d. h., die Ausgangsdaten des einen hängen nicht von den Eingangsdaten des anderen ab); wir können die kleinen Abhängigkeitsgraphen durch eine Verschachtelung der Eingänge der Stränge zu einem großen Abhängigkeitsgraphen kombinieren. Fig. 5 zeigt einen einfachen Fall mit zwei Strängen: das Original-Programm und den Takt. Fig. 6 zeigt das Ergebnis der Anwendung einer einzigen Verschachtelung auf den Code nach Fig. 5, und
  • Fig. 7 zeigt das Ergebnis der Anwendung von zwei alternativen Verschachtelungen auf den Code nach Fig. 5. (3) Um die Domäne der Berechnung zu verändern: Dies läßt sich am besten anhand eines Beispiels erklären. Man betrachte den DFG in Fig. 5. Die Berechnung ist deutlich als "a + b" zu erkennen. Fig. 7 zeigt das gleiche Programm mit zwei Verschachtelungsstufen und wie "die Arithmetic über die Verschachtelung" durchgeführt wird. Zum Zweck der Einfachheit der Erläuterung, wird die Taktberechnung ignoriert und es wird eine einzige Verschachtelungsfunktion verwendet: (a, b)-> (a + b, a - b); das heißt, die beiden Eingangsdaten sind sind "a" und "b", und die beiden Ausgangsdaten sind "a + b" und "a - b". Diese Operation ist analog zu der Modulationsfunktion, die bei UKW-Stereo-Übertragungen zur Kodierung des linken und rechten Kanals verwendet wird. "a + b" stellt das Hauptsignal dar, das von Mono- Empfängern empfangen wird, während das "a - b"-Signal von Stereo-Empfängern verwendet wird, um die ursprünglichen Kanalsignale "a" und "b" wiederzugewinnen.
  • Zunächst werden zwei Eingangsdatenpaare (a, c) und (b, c) verschachtelt, wodurch vier mit t, u, v, w bezeichnete Zwischenergebnisse erzeugt werden. Es ist zu beachten, daß (t, u) die Werte von a und c kodiert, und daß (v, w) b, c kodiert. Nur die kodierten Werte müssen bearbeitet werden, um die gewünschte Summe s = a + b zu erzeugen. Der Ausgang (x, y) kodiert dann den Wert von s und die nachfolgende Berechnung kann die Arithmetic auf die gleiche Weise durchführen, so daß der aktuelle Wert von a + b nicht in dem Programm erscheint, das durch die EIS- Kodierung kodiert wurde (tatsächlich sind die Variablen "a" und "b" nie gemeinsam aufgetreten). Der algebraischen Berechnung kann wie unten dargestellt gefolgt werden:
  • t = a + c
  • u = a - c
  • v = b + c
  • w = b - c
  • Darstellung der Eingangsvariablen als Funktion der Zwischenvariablen:
  • a = (t + u)/2
  • c = (t - u)/2 oder (v - w)/2
  • b = (v + w)/2
  • Vereinfachung von "y"
  • y = 2t + v + w = (t + u) + (v + w) + (t - u) = 2 · (a + b + c) = 2 · (s + c)
  • Ähnliche Vereinfachung von "x"
  • x = 2u + v + w (t + u) + (v + w) - (t - u) = 2 · (a + b - c) = 2 · (s - c)
  • daher: x + y = 2 · (s + c) + 2* (s - c) = 2 · (25) = 4s
  • oder s = (x + y)/4
  • Gemäß einer anderen Ausführungsform umfaßt das Verfahren weiterhin die Schritte des Hinzufügens eines Historien-Prüf-Codes, der dazu verwendet wird, eine Nachahmung bei dem Ausführungspfad zu erfassen (zum Beispiel, indem ein Debugger zur Änderung der Werte verwendet wird, die eine bedingte Verzweigung steuern), und um den Code mit dem originalen ausführbaren Programm und anderen Bestandteilen wie hier beschrieben zu verschachteln.
  • Die Historie kann überprüft werden, indem zwei Variablen eingefügt werden: "komme-von" und "gehe-zu". Am Ende von jedem Basisblock, vor dem Sprung, würden die beiden Variablen auf die zwei Endpunkte des Sprungs gesetzt. Am Anfang von jedem Basisblock wird ein Code eingefügt, um die vorhandenen "gehe-zu"-Punkte zu überprüfen, bei denen eine tatsächliche Ausführung erfolgt, wobei "komme-von" einer der erlaubten Vorgänger ist.
  • Gemäß einer Ausführungsform der Erfindung wird das EIS-Kodier- Verfahren wie unten beschrieben durchgeführt. Die Schritte in dem Verfahren beziehen sich zum Zweck des Treffens von Entscheidungen alle auf einen Zufalls-Bit-Strom. Sie konsumieren diesen Zufallsstrom, wenn die Entscheidungen getroffen werden. Der Zufalls-Bit-Strom funktioniert daher als ein "Einmal- Polster" bei der Verschlüsselung, außer, daß eine Entschlüsselung normalerweise nie erforderlich ist (und sie ist in den meisten Fällen auch nicht möglich). Für eine maximale Sicherheit sollte eine echte Zufallsquelle verwendet werden, eine gute Pseudo-Zufalls-Quelle arbeitet jedoch auch ausreichend gut (und sie weist eine bessere Wiederholbarkeit für Testzwecke auf).
  • Nachfolgend ist der genaue Algorithmus für eine Ausführungsform der Erfindung angegeben.
  • 100: Initialisierung:
  • 120: Bereite das Eingangs-Programm durch Umwandlung in einen DFG (Daten-Fluß-Graph) vor.
  • 140: Takt- und Nachahmungs-Flaggen-Strategie:
  • - entscheide, ob Duplikat-Takte erforderlich sind, etc.
  • - füge Takt-/Nachahmungs-Flaggen-Initialisierungs- Code zu jedem Eingangs-BB hinzu
  • - erzeuge eine gewisse Anzahl von Takt-Kaskaden: zum Beispiel unterschiedliche Wege der Inkrementierung, unterschiedliche Höhen des Inkrements, etc.
  • 160: Kaskaden-Strategie:
  • - entscheide die Anzahl der Kopien von unterschiedlichen Kaskaden
  • - entscheide die Breite und Länge für jede Kaskade.
  • 180: Erzeuge Trap-Code: (verwendet zur Verfolgung bei der Entdeckung einer Nachahmung)
  • - entscheide, wie viele unterschiedliche Trap-Code- Schleifen zu erzeugen sind
  • - erzeuge Zufalls-Basis-Blöcke, die dem Original- Programm ähnlich sind (zum Beispiel, Kopiere Original-BB und ändere ihn etwas ab).
  • 200: Füge Kaskaden zu jedem BB hinzu:
  • 220: Nimm eine Takt-Kaskade und erzeuge eine Kopie für diesen BB
  • 240: Erzeuge Prüf-Kaskaden
  • - gebe die BB's-Erfordernisse zur Initialisierung der Kaskaden ein (wahrscheinlich mit Zufallsdatenwerten)
  • - Nicht-Eingabe-BB's übernehmen die Werte des vorhergehenden BB's und können ebenso Zufallskonstanten hinzufügen
  • - passende Paare von Prüfkaskaden erfordern ebenso passende Eingabewerte
  • 260: Ersetze alle Original-Konstanten durch ein zufällig erzeugtes Äquivalent, z. B. kann 37 durch 25 + 12 ersetzt werden.
  • 300: Verschachtele jeden BB
  • 320: Setze Prüf- und Trap- (bzw. Sprung-) Punkte wie erforderlich ein:
  • - wenn die berechneten Werte einer Kaskade sich von den erwarteten Werten unterscheiden, setze die Nachahmungsflagge und starte einen Timer
  • - wenn die Nachahmungsflagge gesetzt ist und der Timer abgelaufen ist, gehe zum Trap-Code.
  • 340: Initialisiere die "Wellenfront" von Berechnungen, die zum Schießen bzw. Feuern geeignet sind (weil alle ihre Eingangswerte bereits berechnet sind und alle weiteren Ordnungsbedingungen erfüllt sind).
  • 360: Nimm ein Zufallspaar von Werten von der fertigen Wellenfront zum Verschachteln:
  • - es wird eine zufällige Köder-Berechnung hinzugefügt, um das Berechnungspaar für die Verschachtelung sicherzustellen
  • - es wird ebenfalls eine zufällige Köder-Berechnung hinzugefügt, um den wahren Abhängigkeitsgraph zu verbergen
  • 361: Bei einem gegebenen Paar von Werten:
  • - nimm eine Zufalls-Verschachtelungs-Funktion
  • - ersetze die beiden getrennten Berechnungen durch eine einzige Berechnung der Verschachtelungs- Funktion.
  • 380: Bringe die Wellenfront auf den neuen Stand:
  • - wenn die Wellenfront nicht leer ist, gehe zu Schritt 360.

Claims (12)

1. Verfahren zum Kodieren eines ausführbaren Programms zum Schutz vor Nachahmungen und zum Verbergen der darin enthaltenen Informationen, derart, daß das kodierte Programm ausführbar bleibt, mit folgenden Schritten:
a) Erzeugung von zwei oder mehr identischen Kopien einer Prüf-Kaskade für jeden von einen oder mehreren Basis-Blöcken des ausführbaren Programms, wobei jede Prüf-Kaskade ähnlich zu jedem entsprechenden Basis-Block ist und für einen vorhergegebenen Sicherheitslevel eine Länge und Breite aufweist;
b) Einfügung von periodischen Prüf-Codes, die über die Kopien der Prüf-Kaskaden verteilt sind, wobei die Prüf-Codes die erwarteten Ausgabedaten der Prüf-Kaskaden an vorherbestimmten Punkten in dem ausführbaren Programm überwachen.
c) Verschachtelung des ausführbaren Programms und der Prüf-Kaskaden, so daß die Ausgabedaten des kodierten ausführbaren Programms von allen Eingangswerten des ausführbaren Programms und der Prüf-Kaskaden abhängen.
2. Verfahren zur Kodierung eines ausführbaren Programms nach Anspruch 1, das weiterhin die folgenden Schritte umfaßt:
e) Erzeugung einer Takt-Kaskade, die eine Nachahmungs- Flagge und einen Takt aufweist, die zumindest um einen Tick an einem oder mehreren ausgewählten Punkten eines ausgewählten Satzes von Verzweigungs-Programmschritten vorgestellt sind; und
f) Verschachteln des ausführbaren Programms, der Takt- Kaskade und der Prüf-Kaskaden.
3. Verfahren zur Kodierung eines ausführbaren Programms nach Anspruch 2, das weiterhin den Schritt umfaßt:
g) Anhängen eines Fallen- bzw. Trap-Codes an einen oder an mehrere ausgewählte Punkte des Programms, wobei dieser Trap-Code als Antwort auf die Nachahmungs-Flagge und den Takt ausgeführt wird, wobei die Ausführung dieses Trap-Codes derart aufgebaut ist, daß das Ende der normalen Ausführung verursacht wird.
4. Verfahren zur Kodierung eines ausführbaren Programms nach Anspruch 3, das weiterhin den Schritt umfaßt:
h) Anhängen von einem oder von mehreren Trap-Codes an die Takt-Kaskade, wobei jeder Trap-Code als Antwort auf die Nachahmungs-Flagge und den Takt auszuführen ist; und
i) rekursives Wiederholen der Schritte c) und d) für jeden Trap-Code, so daß auch jeder Trap-Code vor der Nachahmung geschützt ist.
5. Verfahren zur Kodierung eines ausführbaren Programms nach einem der Ansprüche 3 und 4, bei dem die Ausführung des Trap-Codes derart aufgebaut ist, daß einer oder mehrere der folgenden Schritte in einer vorherbestimmten Reihenfolge ausgeführt werden:
(1) Ausgabe einer Warn-Nachricht und Beendigung der Ausführung des Programms;
(2) Beendigung der anormalen Ausführung des Programms ohne eine Warn-Nachricht; und
(3) Ausführung eines Programms, das innerhalb des Trap-Codes unendliche Schleifen ausführt.
6. Verfahren zur Kodierung eines ausführbaren Programms nach einem der Ansprüche 1 bis 4, das weiterhin den Schritt umfaßt: Steuerung der Intensität der Verschachtelung, um die Sicherheit und die Leistung des kodierten Programms zu verändern.
7. Verfahren zur Kodierung eines ausführbaren Programms nach einem der Ansprüche 2 bis 4, das weiterhin den Schritt umfaßt: Steuerung der Breite und der Vielfältigkeit von irgendeiner der Prüf- und Takt-Kaskaden, um die Sicherheit und die Leistung des kodierten Programms zu verändern.
8. Verfahren zur Kodierung eines ausführbaren Programms nach einem der Ansprüche 1 bis 4, das weiterhin den Schritt umfaßt: Steuerung der Breite und Vielfältigkeit der Kaskaden aus einem oder mehreren ausgewählten Basis-Blöcken, die anfälliger für einen Angriff sind, um die Sicherheit und die Leistung des kodierten Programms weiter zu verändern.
9. Verfahren zur Kodierung eines ausführbaren Programms nach einem der Ansprüche 1 bis 4, das weiterhin den Schritt umfaßt: Steuerung der Intensität der Verschachtelung von Kaskaden aus einem oder mehreren ausgewählten Basis-Blöcken, die anfälliger für einen Angriff sind, um die Sicherheit und die Leistung des kodierten Programms weiter zu verändern.
10. Verfahren zur Kodierung eines ausführbaren Programms nach einem der Ansprüche 3 und 4, das weiterhin den Schritt umfaßt: Einfügen eines Takt-Einstell- und Takt-Lese-Codes in die periodisch eingefügten Prüf-Codes, mit einem Trap-Code, der als Antwort auf die Nachahmungs-Flagge und den Lese-Wert des Taktes ausgeführt wird, wodurch eine variable Zeitverzögerung eingefügt wird, bevor der Trap-Code ausgeführt wird.
11. Verfahren zur Kodierung eines ausführbaren Programms nach einem der Ansprüche 1 bis 4, das weiterhin den Schritt umfaßt:
Anordnen von Sicherheits-Eingangs- und -Ausgangs-Zellen eines nicht-verzweigten Programm-Schritts; und
Steuerung der Breite und Vielfältigkeit der zugeordneten Kaskaden, um die Sicherheit des kodierten Programms zu erhöhen.
12. Verfahren zur Kodierung eines ausführbaren Programms nach einem der Ansprüche 1 bis 4, das weiterhin den Schritt umfaßt:
Einfügen von Historien-Prüf-Codes, um die Nachahmung des Ausführungspfades zu entdecken; und
Verschachtelung des Historien-Prüf-Codes mit dem ausführbaren Programm und weiteren Kaskaden.
DE69604307T 1996-03-07 1996-12-19 Kodierungstechnik für software Expired - Lifetime DE69604307T2 (de)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US61196896A 1996-03-07 1996-03-07
PCT/CA1996/000859 WO1997033216A1 (en) 1996-03-07 1996-12-19 Encoding technique for software and hardware

Publications (2)

Publication Number Publication Date
DE69604307D1 DE69604307D1 (de) 1999-10-21
DE69604307T2 true DE69604307T2 (de) 1999-12-30

Family

ID=24451142

Family Applications (1)

Application Number Title Priority Date Filing Date
DE69604307T Expired - Lifetime DE69604307T2 (de) 1996-03-07 1996-12-19 Kodierungstechnik für software

Country Status (6)

Country Link
US (1) US6088452A (de)
EP (1) EP0885416B1 (de)
JP (1) JPH11511582A (de)
CA (1) CA2243469C (de)
DE (1) DE69604307T2 (de)
WO (1) WO1997033216A1 (de)

Families Citing this family (38)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO1999001815A1 (en) * 1997-06-09 1999-01-14 Intertrust, Incorporated Obfuscation techniques for enhancing software security
US6334189B1 (en) 1997-12-05 2001-12-25 Jamama, Llc Use of pseudocode to protect software from unauthorized use
US6480959B1 (en) * 1997-12-05 2002-11-12 Jamama, Llc Software system and associated methods for controlling the use of computer programs
US6643775B1 (en) 1997-12-05 2003-11-04 Jamama, Llc Use of code obfuscation to inhibit generation of non-use-restricted versions of copy protected software applications
US6957341B2 (en) * 1998-05-14 2005-10-18 Purdue Research Foundation Method and system for secure computational outsourcing and disguise
US6463538B1 (en) * 1998-12-30 2002-10-08 Rainbow Technologies, Inc. Method of software protection using a random code generator
US7770016B2 (en) 1999-07-29 2010-08-03 Intertrust Technologies Corporation Systems and methods for watermarking software and other media
US7430670B1 (en) 1999-07-29 2008-09-30 Intertrust Technologies Corp. Software self-defense systems and methods
US7287166B1 (en) 1999-09-03 2007-10-23 Purdue Research Foundation Guards for application in software tamperproofing
US7757097B2 (en) * 1999-09-03 2010-07-13 Purdue Research Foundation Method and system for tamperproofing software
JP3888823B2 (ja) * 2000-02-14 2007-03-07 松下電器産業株式会社 半導体集積回路
WO2002079955A2 (en) 2001-03-28 2002-10-10 Nds Limited Digital rights management system and method
ITMI20011938A1 (it) * 2001-09-17 2003-03-17 Cit Alcatel Metodo per criptare un flusso di dati
CA2363795A1 (en) * 2001-11-26 2003-05-26 Cloakware Corporation Computer system protection by communication diversity
US20030120938A1 (en) * 2001-11-27 2003-06-26 Miki Mullor Method of securing software against reverse engineering
CA2372034A1 (en) * 2002-02-14 2003-08-14 Cloakware Corporation Foiling buffer-overflow and alien-code attacks by encoding
US7707295B1 (en) 2002-05-03 2010-04-27 Foundry Networks, Inc. Connection rate limiting
US8554929B1 (en) * 2002-05-03 2013-10-08 Foundry Networks, Llc Connection rate limiting for server load balancing and transparent cache switching
US8819252B1 (en) * 2002-05-03 2014-08-26 Foundry Networks, Llc Transaction rate limiting
US20030217280A1 (en) * 2002-05-17 2003-11-20 Keaton Thomas S. Software watermarking for anti-tamper protection
US7367053B2 (en) * 2002-10-11 2008-04-29 Yamatake Corporation Password strength checking method and apparatus and program and recording medium thereof, password creation assisting method and program thereof, and password creating method and program thereof
US7200760B2 (en) * 2002-12-31 2007-04-03 Protexis, Inc. System for persistently encrypting critical software data to control the operation of an executable software program
US20040156388A1 (en) * 2003-02-07 2004-08-12 Lockheed Martin Corporation System for maintaining quality of service
US8510571B1 (en) 2003-03-24 2013-08-13 Hoi Chang System and method for inserting security mechanisms into a software program
US7249260B2 (en) * 2003-06-12 2007-07-24 Sun Microsystems, Inc. Method and apparatus for implementing a pluggable password obscuring mechanism
US7313817B2 (en) * 2003-06-17 2007-12-25 Lockheed Martin Corporation Data transmission system utilizing efficient complexity estimation of the kolmogorov complexity for data transmission
US20050071656A1 (en) * 2003-09-25 2005-03-31 Klein Dean A. Secure processor-based system and method
US20060020552A1 (en) * 2004-07-26 2006-01-26 James Sloan Copy-restriction system for digitally recorded, computer disk-based music recordings
US7900243B2 (en) * 2006-10-19 2011-03-01 Oracle America, Inc. Method and system for managing execution of an application module
US8752032B2 (en) 2007-02-23 2014-06-10 Irdeto Canada Corporation System and method of interlocking to protect software-mediated program and device behaviours
US8429637B2 (en) * 2008-09-02 2013-04-23 Apple Inc. System and method for conditional expansion obfuscation
EP2689376B1 (de) * 2011-03-24 2020-12-23 Irdeto B.V. System und verfahren zur bereitstellung von abhängigkeitsnetzwerken bei anwendungen für den widerstand gegen angriffe
EP2831795B1 (de) 2012-03-30 2019-01-09 Irdeto B.V. Sicherung zugänglicher systeme mit variablenabhängiger codierung
CN103870340B (zh) * 2014-03-06 2017-11-07 华为技术有限公司 流计算系统中的数据处理方法、控制节点及流计算系统
US9858440B1 (en) * 2014-05-23 2018-01-02 Shape Security, Inc. Encoding of sensitive data
US9495111B2 (en) * 2014-10-10 2016-11-15 The Boeing Company System and method for reducing information leakage from memory
US20160132317A1 (en) 2014-11-06 2016-05-12 Intertrust Technologies Corporation Secure Application Distribution Systems and Methods
US10082975B1 (en) 2017-03-02 2018-09-25 Micron Technology, Inc. Obfuscation-enhanced memory encryption

Family Cites Families (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4525599A (en) * 1982-05-21 1985-06-25 General Computer Corporation Software protection methods and apparatus
US4740890A (en) * 1983-12-22 1988-04-26 Software Concepts, Inc. Software protection system with trial period usage code and unlimited use unlocking code both recorded on program storage media
US4646234A (en) * 1984-02-29 1987-02-24 Brigham Young University Anti-piracy system using separate storage and alternate execution of selected proprietary and public portions of computer programs
GB2163577B (en) * 1984-08-23 1988-01-13 Nat Res Dev Software protection device
US4644493A (en) * 1984-09-14 1987-02-17 International Business Machines Corporation Implementing a shared higher level of privilege on personal computers for copy protection of software
US4864494A (en) * 1986-03-21 1989-09-05 Computerized Data Ssytems For Mfg., Inc. Software usage authorization system with key for decrypting/re-encrypting/re-transmitting moving target security codes from protected software
US5047928A (en) * 1986-10-24 1991-09-10 Wiedemer John D Billing system for computer software
US4866769A (en) * 1987-08-05 1989-09-12 Ibm Corporation Hardware assist for protecting PC software
US4937863A (en) * 1988-03-07 1990-06-26 Digital Equipment Corporation Software licensing management system
US5123045A (en) * 1989-08-18 1992-06-16 Massachusetts Institute Of Technology Comprehensive software protection system
EP0459046A1 (de) * 1990-05-31 1991-12-04 International Business Machines Corporation Rechnerprogrammschutz
CA2026998C (en) * 1990-10-05 1994-05-10 Thomas Edwin Glover Dynamic trace elements
US5359659A (en) * 1992-06-19 1994-10-25 Doren Rosenthal Method for securing software against corruption by computer viruses
DE69432974T2 (de) * 1993-05-10 2004-05-27 Thinking Software, Inc., Cupertino Verfahren und vorrichtung zur automatischen analyse eines zielprogramms
US5613004A (en) * 1995-06-07 1997-03-18 The Dice Company Steganographic method and device

Also Published As

Publication number Publication date
DE69604307D1 (de) 1999-10-21
EP0885416B1 (de) 1999-09-15
JPH11511582A (ja) 1999-10-05
US6088452A (en) 2000-07-11
EP0885416A1 (de) 1998-12-23
CA2243469A1 (en) 1997-09-12
CA2243469C (en) 2000-10-31
WO1997033216A1 (en) 1997-09-12

Similar Documents

Publication Publication Date Title
DE69604307T2 (de) Kodierungstechnik für software
DE69735103T2 (de) Manipulationssicheres Verfahren und Vorrichtung
Howard et al. Real'versusimaginary'noise in diffusion-limited reactions
DE69028226T2 (de) Gegen unbefugte Manipulation gesichertes Zugangsberechtigungsverfahren
US7966499B2 (en) System and method for obscuring bit-wise and two's complement integer computations in software
DE10319435B4 (de) Verfahren zur Verarbeitung von Daten zum Schutz eines Softwareprogramms vor Rekonstruktion
DE69626530T2 (de) Schutz von software gegen benutzung ohne erlaubnis
DE69330489T2 (de) Vorrichtung zum Schutz von Software
DE69611605T2 (de) System zur sicherstellung, dass das "blinding" von geheimschlüsselzertifikaten begrenzt ist, auch wenn das vergabeprotokoll im parallelmodus ausgefürht wird
DE112021004937T5 (de) Sicheres erneutes verschlüsseln von homomorph verschlüsselten daten
EP1184771A1 (de) Verfahren zum Schutz von Computer-Software und/oder computerlesbaren Daten sowie Schutzgerät
DE10393807T5 (de) Verfahren zum Schutz von Software von Debugger-Angriffen
DE112021005364T5 (de) Abwehr von gezielten datenbankangriffen durch dynamische generierung von honeypot-datenbankantworten
DE60100363T2 (de) Sequenznummerierungsmechanismus zur sicherung der ausführungsordnungs-integrietät von untereinander abhängigen smart-card anwendungen
DE60022770T2 (de) Gegenmassnahme in einem elektronischen baustein zur ausführung eines kryptoalgorithmus mit öffentlichem schlüssel vom rsa-typ
DE102018116572A1 (de) Schutz gegen seitenkanalangriffe
DE69707717T2 (de) Modulo-arithmetischer koprozessor mit einer schaltung für die division ganzer zahlen
EP1506473B1 (de) Ausspähungsgeschützte modulare inversion
Li et al. A dynamic and heterogeneous web application to defense webshell attacks by using diversified PHP code
EP3798873A1 (de) Verfahren zum schützen einer computer-implementierten anwendung vor manipulation
DE102023106166B3 (de) Sicherheits-controller und verfahren zur durchführung einer auswahlfunktion
DE102004058882A1 (de) Erzeugen von Programmcode in einem Ladeformat und Bereitstellen von ausführbarem Programmcode
DE102014001647A1 (de) Operation basierend auf zwei Operanden
DE102004052196B4 (de) Ausspähungsgeschütztes Ausführen von Operationen unter Verwendung einer maskenunterstützenden Recheneinheit
CN105184176A (zh) 用于电子设备的文件处理方法和装置

Legal Events

Date Code Title Description
8364 No opposition during term of opposition
8327 Change in the person/name/address of the patent owner

Owner name: NORTEL NETWORKS LTD., ST.LAURENT, QUEBEC, CA